Пакетный файл для определения, установлен ли локальный принтер, и для выполнения каких-либо задач - PullRequest
1 голос
/ 19 января 2012

Я создаю командный файл, чтобы определить, был ли установлен локальный принтер, и если он не установлен, будет запущен другой код.

For /F "Tokens=1 delims=" %%I In ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices" ^|find /I "WPL"') Do If "%%I"=="Printer WPL-606" Goto :EOF
REM Otherwise Do Stuff

Результат, который я получаю при запуске:

C: \ Documents and Settings \ kalamane> If "Принтер" WPL-606 REG_SZ winspool, Ne07: "==" Принтер WPL-606 "Перейти к: EOF

C: \ Documents and Settings \ kalamane> REM иначе делать вещи

Очевидно, что остальная часть строки из этой записи реестра включена в сравнение, поэтому она не работает.

Я довольно новичок в написании сценариев, и я думаю, что я ошибаюсь, это токены и разделители. Вот строка из реестра, когда используется только запрос reg:

Printer WPL-606     REG_SZ  winspool,Ne07:

Может кто-нибудь объяснить, как я могу получить это, чтобы выбрать правильную часть реестра?

Ответы [ 2 ]

3 голосов
/ 19 января 2012

Запрашивая реестр и используя токены / разделители, которые вы используете, вы получаете весь вывод строки.Вам нужно установить пробелы в качестве разделителей и взять первые 2 токена.Вы хотели бы следующее:

For /F "Tokens=1,2 delims= " %%I In ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices" ^|find /I "WPL"') Do (
  If "%%I %%J"=="Printer WPL-606" (
     GOTO:EOF
  ) ELSE (
     REM Otherwise Do Stuff
  )
)

Или вы можете использовать PRNMNGR.Это сценарий VBS, локализованный в. \ Windows \ system32 \ prnmngr.vbs, который помогает вам управлять принтерами (в том числе перечислять их).Так это будет выглядеть так:

cscript "C:\WINDOWS\system32\prnmngr.vbs" -l -s \\localhost | FIND /I "WPL-606"
IF [%errorlevel%] == [0] (
  GOTO:EOF
) ELSE (
  REM Otherwise Do Stuff
)

Вы можете проверить команду в CMD с помощью PRNMNGR /?

2 голосов
/ 19 января 2012

Хотя ответ Mechaflash отличный (особенно вторая часть о prnmngr.vbs), запуск PRNMNGR занимает до десяти секунд, чтобы получить результаты.

Использование Microsoft Devcon возвращаетРезультаты почти мгновенно.Вот код, измененный для его использования:

For /F "Tokens=1,2 delims=\" %%I In ('devcon.exe findall *WPL-606*') Do (
  If "%%J"=="PRINTERWPL-606" (
     GOTO:EOF
  ) ELSE (
     REM Otherwise Do Stuff
  )
)

Я включаю этот ответ для полноты, потому что он решает мою проблему и поможет будущим посетителям, ищущим такой пакетный файл.Я принимаю ответ Mechaflash, потому что он отвечает на мой настоящий вопрос.

...