Как использовать printui.exe со значением, содержащим имя принтера

Я пытаюсь сделать небольшой скрипт, который автоматически удалит все принтеры, кроме тех, которые являются частью ОС (Microsoft в PDF, OneNote и т. д.).

Я пытался отфильтровать их один за другим в цикле for, но по некоторым причинам он говорит, что не распознает имя принтера.

Вместо этого я повторил результат, чтобы увидеть, что входит, и имя принтера показалось правильным.

Поэтому я думаю, что в конце моего значения может быть символ новой строки, и я хотел бы знать, как убедиться, что имя правильно выводится в команде printui.exe.

REM Loop that will go through all printer name that are installed on the computer
for /f "tokens=*" %%a in ('wmic printer get name') do (
    REM Verify if the printer name contain "Microsoft", "OneNote" or "Name"
    echo %%a | findstr /i "Microsoft OneNote Name" > nul
    if errorlevel 1 (
        REM Delete the printer that dosent contain any of the word mentionned before
        echo %%a
        printui.exe /dl /n %%a
    ) else (
        REM Delete nothing
    )
)

Приведенный выше код привел к появлению окна сообщения об ошибке, в котором говорилось, что он не распознает принтер, что он может быть отключен или указано неверное имя принтера. (что мне не подходит)

Я ожидал, что команда сработает без ошибок и скажет, что процесс завершен.

Попробуйте printui.exe /dl /n "%%a"

Magoo 02.02.2023 19:50
printui.exe /dl /n "%%a" дает тот же результат
Frist 02.02.2023 19:53

Я не уверен, что понимаю, что вы имеете в виду... С "" или без "" я получаю одно и то же сообщение об ошибке. Я также хочу отметить, что если я вручную наберу команду de в cmd с правильным именем принтера, команда будет работать правильно и продолжить удаление принтера без ошибок.

Frist 02.02.2023 21:40

Причина, по которой я думаю, что в значении может быть символ новой строки, заключается в том, что последний результат говорит ECHO is disabled, что означает, что значение должно быть пустым, если я не ошибаюсь. Команда, возвращающая имя принтера, не должна нигде возвращать пустую строку.

Frist 02.02.2023 21:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION 
for /f "delims = " %%b in ('wmic printer get name') do for /f "delims = " %%B in ("%%b") do (

 REM Verify if the printer name contain "Microsoft", "OneNote" or "Name"
 echo %%B | findstr /i "Microsoft OneNote Name" > nul
 if errorlevel 1 (
 REM Delete the printer that dosent contain any of the word mentionned before
 SET "myprinter=%%B"
 CALL :mangle
 echo %%B --- !myprinter! ---
 printui.exe /p /n !myprinter!
 ) else (
  REM Delete nothing
 )
)
GOTO :EOF

:: IF the printername myprinter contains spaces, replace with `" "`
:mangle
IF "%myprinter:~-1%"= = " " SET "myprinter=%myprinter:~0,-1%"&GOTO mangle
SET "myprinter=!myprinter:  = " "!"
GOTO :eof

Всегда сверяйтесь с тестовым каталогом перед применением к реальным данным.

Это странно. Если имя принтера, например HP LaserJet CP 1025, содержит пробелы, то оно должно быть введено как HP" "LaserJet" "CP" "1025 — и да, я перепроверил это. Ссылка на сторонний URL: Spiceworks - настроить принтер

Я использовал вариант /p, так как не хочу удалять принтеры.

Эта работа вокруг сделала свое дело, большое спасибо за вашу помощь!

Frist 02.02.2023 22:28

ВАЖНОЕ ЗАМЕЧАНИЕ! GOTO :EOF в строке 17 вызывает сбой программы в конце цикла. Если убрать, то все равно работает. Вы должны отредактировать его, так как я хочу, чтобы вы сохранили кредиты за поиск решения.

Frist 02.02.2023 22:46

Что ты имеешь в виду под "сбой"? Как только цикл for закончился, делать больше нечего. В этом случае удаление этого goto приведет к тому, что :mangle будет выполнено еще раз, что просто изменит значение myprinter, а затем завершит пакет, поэтому это не должно иметь фактического значения - пакет должен завершиться таким же образом. Какую разницу вы заметили?

Magoo 02.02.2023 23:13

@KJ Это может объяснить, почему иногда мое значение вместо этого оказывалось пустым ... В данный момент я все еще изучаю пакетное кодирование, поэтому я тоже могу ошибаться.

Frist 02.02.2023 23:24

@Magoo Когда я включал ваш код в часть пакета в качестве теста, программа внезапно закрывалась без продолжения остальной части кода. Пакетный файл закроется независимо от того, что будет дальше, когда он достигнет GOTO :EOF в строке 17.

Frist 02.02.2023 23:24

@KJ, теперь это имеет смысл. Спасибо за разъяснение.

Frist 03.02.2023 00:35

Другие вопросы по теме