打印管理脚本的解析输出

Parse output of Printing Admin Scripts

出于某种原因或其他原因,当我 运行 它下面的代码 t运行 包含我在最后回显的字符串的最末端时。有什么办法可以避免吗?

@echo off
chdir C:\Windows\System32\Printing_Admin_Scripts\en-US
For /f "skip=1 delims=" %%a in ('wmic computersystem get name') do for /f "delims=" %%b in ("%%a") do set "compName=%%a"
Set comp=%compName:~0,5%
Set pName=%comp%P1

For /f "delims=" %%a in ('cscript prnmngr.vbs -l ^|findstr /i /b /n /c:"printer name" ^|findstr /b "6:"') do set printerName0=%%a
For /f "delims=" %%a in ('cscript prnmngr.vbs -l ^|findstr /i /b /n /c:"printer name" ^|findstr /b "25:"') do set printerName1=%%a
For /f "delims=" %%a in ('cscript prnmngr.vbs -l ^|findstr /i /b /n /c:"printer name" ^|findstr /b "44:"') do set printerName2=%%a

If "%printerName0%" == "6:Printer name %pName%" (
For /f "delims=" %%a in ('cscript prnmngr.vbs -l ^|findstr /i /b /n /c:"driver name" ^|findstr /b "8:"') do set driverName=%%a
)
If "%printerName1%" == "25:Printer name %pName%" (
    For /f "delims=" %%a in ('cscript prnmngr.vbs -l ^|findstr /i /b /n /c:"driver name" ^|findstr /b "27:"') do set driverName=%%a
)
If "%printerName2%" == "44:Printer name %pName%" (
    For /f "delims=" %%a in ('cscript prnmngr.vbs -l ^|findstr /i /b /n /c:"driver name" ^|findstr /b "46:"') do set driverName=%%a
)
If "%printerName0%" == "6:Printer name %pName%" (
    set pDriver=%driverName:~14%
)
If "%printerName1%" == "25:Printer name %pName%" (
    set pDriver=%driverName:~15%
)
If "%printerName2%" == "44:Printer name %pName%" (
    set pDriver=%driverName:~15%
)
echo %pDriver%
pause

这就是我认为您正在尝试做的事情。真的对你所有额外的 findstr 代码和设置命令感到困惑。

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

PUSHD C:\Windows\System32\Printing_Admin_Scripts\en-US

SET I=0
For /f "tokens=1,2* delims= " %%G in ('cscript //Nologo //H:CScript prnmngr.vbs -l ^|findstr /i /c:"printer name"') do (
    SET /A I+=1
    SET "PRINTER.NAME[!I!]=%%I"
    For /f "tokens=1,2* delims= " %%J in ('cscript //Nologo //H:CScript prncnfg.vbs -g -p "%%I" ^|findstr /i /c:"driver name"') do (
        SET "PRINTER.DRIVER[!I!]=%%L"
    )
)

FOR /L %%I IN (1,1,%I%) DO (
    ECHO PRINTER %%I = !PRINTER.NAME[%%I]!
    ECHO  DRIVER %%I = !PRINTER.DRIVER[%%I]!
)
popd
pause

在我的电脑上输出。

PRINTER 1 = Microsoft XPS Document Writer
 DRIVER 1 = Microsoft XPS Document Writer
PRINTER 2 = Fax
 DRIVER 2 = Microsoft Shared Fax Driver
PRINTER 3 = \SERVER_NAME\WI5140-XEROX-9
 DRIVER 3 = Xerox WorkCentre 5330 PCL6
PRINTER 4 = \SERVER_NAME\WI5101-XEROX-12
 DRIVER 4 = Xerox WorkCentre 5330 PS
PRINTER 5 = \SERVER_NAME\WI5101-XEROX-1
 DRIVER 5 = Xerox WorkCentre 7225 PS
PRINTER 6 = \SERVER_NAME\WI5140-XEROX-31
 DRIVER 6 = Xerox ColorQube 8870DN PS
PRINTER 7 = \SERVER_NAME\WI5140-XEROX-15
 DRIVER 7 = Xerox Phaser 5550DN PS
Press any key to continue . . .

编辑:20170225 14:35 CST

正如您在之前的评论中所说,您只是在寻找一个打印机驱动程序,而我在之前的评论中已经说过,您可以使用 EXACTLY 一个 FOR /F 命令来做到这一点,因为您已经知道打印机的名称。您不需要使用 prnmngr.vbs 来获取驱动程序,因为 prncnfg.vbs 允许您列出打印机的配置,然后您可以使用 findstr 来获取驱动程序。您知道打印机的名称,因此可以将其用作 prncnfg.vbs 的输入以列出该打印机的配置。

For /f "tokens=1,2* delims= " %%J in ('cscript //Nologo //H:CScript prncnfg.vbs -g -p "%pName%" ^|findstr /i /c:"driver name"') do set "pDriver=%%L" 

编辑 20170225 15:20 CST

让我们用 prnmngr.vbs 蛮力获取驱动程序,因为这似乎是您想要用来获取驱动程序的方法。

Set "pName=%comp%P1"
set "flag="
For /f "tokens=1,2* delims= " %%G in ('cscript //nologo prnmngr.vbs -l ^|findstr /i /b /C:"printer name" /C:"driver name"') do (
    IF DEFINED flag set "pDriver=%%I" &GOTO :BREAK
    IF "%pName%"=="%%~I" SET flag=1
)
:BREAK
echo %pDriver%
pause

使用我的原始脚本,我能够通过在最终 If Check 中设置的变量周围插入“”来防止 ) 被剪裁,然后将它们从我输入变量的命令中删除。

If "%printerName0%" == "6:Printer name %pName%" (
    set pDriver="%driverName:~14%"
)
If "%printerName1%" == "25:Printer name %pName%" (
    set pDriver="%driverName:~15%"
)
If "%printerName2%" == "44:Printer name %pName%" (
    set pDriver="%driverName:~15%"
)

稍后使用变量的地方:

cscript prndrvr.vbs -d -m %pDriver%

不需要引号,因为它们包含在我设置最终变量名称的代码的第一部分中。由于这个答案确实需要多几行代码,所以它运行得更快。

问题原因:

当 ) 出现在变量字符串中时,Batch 将其视为 If Check 的结尾,而不是变量字符串中包含的字符。为了保留和防止代码中出现不需要的结果,“ ”必须包含变量。