Я пытаюсь сделать небольшой скрипт, который автоматически удалит все принтеры, кроме тех, которые являются частью ОС (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"
дает тот же результат
Я не уверен, что понимаю, что вы имеете в виду... С ""
или без ""
я получаю одно и то же сообщение об ошибке. Я также хочу отметить, что если я вручную наберу команду de в cmd с правильным именем принтера, команда будет работать правильно и продолжить удаление принтера без ошибок.
Причина, по которой я думаю, что в значении может быть символ новой строки, заключается в том, что последний результат говорит ECHO is disabled
, что означает, что значение должно быть пустым, если я не ошибаюсь. Команда, возвращающая имя принтера, не должна нигде возвращать пустую строку.
@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
, так как не хочу удалять принтеры.
Эта работа вокруг сделала свое дело, большое спасибо за вашу помощь!
ВАЖНОЕ ЗАМЕЧАНИЕ! GOTO :EOF
в строке 17 вызывает сбой программы в конце цикла. Если убрать, то все равно работает. Вы должны отредактировать его, так как я хочу, чтобы вы сохранили кредиты за поиск решения.
Что ты имеешь в виду под "сбой"? Как только цикл for
закончился, делать больше нечего. В этом случае удаление этого goto
приведет к тому, что :mangle
будет выполнено еще раз, что просто изменит значение myprinter
, а затем завершит пакет, поэтому это не должно иметь фактического значения - пакет должен завершиться таким же образом. Какую разницу вы заметили?
@KJ Это может объяснить, почему иногда мое значение вместо этого оказывалось пустым ... В данный момент я все еще изучаю пакетное кодирование, поэтому я тоже могу ошибаться.
@Magoo Когда я включал ваш код в часть пакета в качестве теста, программа внезапно закрывалась без продолжения остальной части кода. Пакетный файл закроется независимо от того, что будет дальше, когда он достигнет GOTO :EOF
в строке 17.
@KJ, теперь это имеет смысл. Спасибо за разъяснение.
Попробуйте
printui.exe /dl /n "%%a"