Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 解析打印管理脚本的输出_Batch File_Truncate - Fatal编程技术网

Batch file 解析打印管理脚本的输出

Batch file 解析打印管理脚本的输出,batch-file,truncate,Batch File,Truncate,出于某种原因,当我运行下面的代码时,它会截断我在末尾回显的字符串的最末端。有没有办法防止这种情况发生 @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=%com

出于某种原因,当我运行下面的代码时,它会截断我在末尾回显的字符串的最末端。有没有办法防止这种情况发生

@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代码和set命令弄糊涂了

@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

正如您在前面的评论中所说,您只需要寻找一个打印机驱动程序,我在前面的评论中也说过,您可以使用一个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检查中设置的变量周围插入“”,然后将它们从我输入变量的命令中删除,来防止)被剪裁

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%
不需要引号,因为在我设置最终变量名的代码的第一部分中包含了。因为这个答案需要更多的代码行,所以它运行得更快

问题的原因是:


当)出现在变量字符串批处理中时,将其视为If检查的结束,而不是变量字符串中包含的字符。为了保留和防止代码产生不必要的结果,必须将变量封装起来。

您没有向我们展示输入是什么以及预期的输出是什么。您确实意识到所有这些
SET
命令都在操作变量。基本上是删除字符。输入不同。脚本正在查找并将打印机驱动程序设置为给定打印机的变量。在这种情况下,对于安装了三台打印机的测试机,它应该返回“HP通用打印驱动程序PCL5(v6.1.0)”,而不是返回“HP通用打印驱动程序PCL5(v6.1.0)”。如果我在设置“pDriver=%driverName:~14%”的最后一组If检查之前回显变量,我将获得完整的“HP通用打印驱动程序PCL5(v6.1.0)”。因此,我认为这是我上一系列If检查中的一些内容。您获得了如此多的额外代码,这一点都不好笑。我将很快向您发布一个代码更少的更好的解决方案。您知道已经有一个名为%computername%的环境变量。不确定您为什么要使用WMIC来获取信息。这很好,但比n我所拥有的,我仍然必须拥有所有的If支票,以说明打印机的位置,因为我只需要从一台打印机而不是所有三台打印机中获取驱动程序。例如:我只在打印机ABC上寻找驱动程序,在一台计算机上,它位于插槽1(即打印机1/驱动程序1)中但在另一个示例中,它可能位于插槽2或插槽3中。我的大部分代码用于说明漫游打印机。如果您知道打印机名称,则只需使用prncfg列出该打印机配置。完整脚本已经包含打印机名称,这部分只是命名正确的驱动程序名称,以便我可以删除它并完全清理系统在安装另一台打印机之前,请先执行em。我将处理您提供的代码,因为我认为它可能会工作,因为我不再需要使用最后三个If检查来删除prnmngr中的行号。请告诉我一点,谢谢。@HaydenB.Siegel,没错。您可以使用prncnfg.vbs仅列出配置对于您想要的打印机。这就是我使用嵌套for命令所做的。如果您已经知道打印机名称,那么您只需要一个for命令来获取驱动程序。@HaydenB.Siegel,您应该将SET语句用引号括起来,以保护特殊字符:
SET“driver=printer(pcl5)”
然后使用延迟扩展引用它。然后,当需要使用此变量时,您可以始终在此变量周围加引号。不要这样做。
set var=“printer(pcl5)”
我当然希望看到您的全部代码。听起来您好像做错了什么。我仍然不明白您为什么要进行所有这些IF检查来分配打印机驱动程序。使用findstr为每个打印机名称分配行号对我来说也没有意义。如果您使用prncnfg.vbs.
cscript//Nologo//H:cscript prncnfg.vbs-g-p“%pName%”^ findstr/i/c:“驱动程序名称”
我还有一些事情要做,比如一个声明,如果缺少,它会伸出手来下载合适的驱动程序,还有一个声明,将打印机默认为灰度,但这是我到目前为止为整个脚本所做的。基本上,它会删除一台打印机,彻底清理计算机,然后安装所需的打印机一。我们的一些位置有两台三台打印机,我们正在删除以安装新打印机的一台打印机可能以随机顺序在打印管理器中,因此我的If检查通过检查que中所有可能的位置来说明这一点。为了澄清这一点,您的脚本工作得很好。我使用底部的三台If检查对其进行了测试,以说明打印机的位置可能是在打印机管理中,它只是需要更长的时间才能运行。虽然它的字节大小要小得多,但如果资源非常紧张,我会使用它。这是一个速度与大小的问题。要么你不理解我试图解释的内容,要么我不理解你。我想你的脚本正在做的比它需要做的更多。我认为这是错误的e是一个通信错误。您的脚本返回所有打印机和驱动程序。我只需要返回一个特定的打印机和驱动程序,该打印机可能在设备和打印机中的任何位置混淆。您提供的脚本不支持