批处理文件,用于检测是否安装了本地打印机,如果不安装则执行操作

时间:2012-01-18 21:47:59

标签: batch-file for-loop delimiter token

我正在创建一个批处理文件,以检测是否已安装本地打印机,以及是否有其他代码将运行。

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>如果是“打印机   WPL-606 REG_SZ winspool,Ne07:“==”打印机WPL-606“转到:EOF

     

C:\ Documents and Settings \ kalamane> REM否则做东西

显然,该注册表项的其余部分包含在比较中,因此失败。

我对脚本非常陌生,我认为我遇到的错误是令牌和分隔符。以下是仅使用reg查询时注册表中的行:

Printer WPL-606     REG_SZ  winspool,Ne07:

有人可以解释一下我如何能够选择正确的注册表部分吗?

3 个答案:

答案 0 :(得分:3)

查询注册表,并使用您正在使用的令牌/ delim,您将获取整个行输出。您需要将空格设置为delim并获取前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。这是一个本地化在。\ windows \ system32 \ prnmngr.vbs中的VBS脚本,可以帮助您管理打印机(包括列出它们)。所以它会是这样的:

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

您可以使用PRNMNGR /?

查看CMD中的命令

答案 1 :(得分:2)

虽然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的回答,因为它回答了我的实际问题。

答案 2 :(得分:0)

使用服务器和打印机作为参数并根据需要进行安装的网络打印机的更通用的答案检查。

printer_check.cmd:

@ECHO OFF
@CLS

SET SERVER=%~1
SET SHARE=%~2
   
For /F "Tokens=* delims=\" %%I In ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices" ^| find /I "\\%SERVER%\%SHARE%"') Do (
IF [%errorlevel%] == [0] (
  ECHO Printer \\%SERVER%\%SHARE% Installed
  GOTO:EOF
) ELSE (
  ECHO Printer \\%SERVER%\%SHARE% NOT Installed
  GOTO:AddPrinter
)
)

:AddPrinter
ECHO Installing Printer \\%SERVER%\%SHARE%
set PRINTUI=rundll32 printui.dll PrintUIEntry /q /in /ga /n
%PRINTUI% "\\%SERVER%\%SHARE%"

:EOF

测试:

@ECHO OFF
CLS

set SERVER=
set SHARE=

CALL "printer_check.cmd" %SERVER% %SHARE%

PAUSE