批量WMIC重定向输出并包装到变量中

时间:2012-10-18 22:18:42

标签: batch-file wmi wmi-query wmic

我正在尝试使用WMIC删除旧打印服务器上的旧打印机

如果我从命令行使用以下语法,它可以工作

WMIC PRINTER WHERE“SERVERNAME LIKE'%% OLDSERVERNAME %%'”DELETE

我被问到是否可以让它更换打印机或更新它们以免服务台获得“我如何添加打印机”电话

我尝试使用SET进行一些变化来设置SERVERNAME的属性,它似乎正在处理,但没有任何变化,执行GET仍会显示旧值。

所以我想我可以做一个FOR / F循环,在变量中包装打印机的名称(sharename),然后在删除违规打印机后使用另一个命令重新创建打印机。

这是我的剧本

@ECHO

ECHO Gathering Installed Printer Information...

FOR /F "tokens=1 skip=1" %%A IN ('WMIC PRINTER WHERE "Servername like "%%printaz1%%"" get sharename') DO SET PRINTERNAME=%%A

ECHO %PRINTERNAME%

所以你会认为你得到的所有值都包含在一个很好的变量中,但是没有,我开启了回声,看起来变量一旦被捕获就被设置回null < / p>

我的输出看起来像这样......

FOR /F "tokens=1 skip=1" %%A IN ('WMIC PRINTER WHERE "Servername like "%%printaz1%%"" get sharename') DO SET PRINTERNAME=%%A

SET PRINTERNAME=nameofprinter

SET PRINTERNAME=

ECHO

ECHO is on.

会喜欢一些关于为什么它似乎倾销字符串的想法。

Powershell和VBScript也不是不可选择的,我对两者都很熟悉,这似乎是可能的,我真的不想重新开始。

5 个答案:

答案 0 :(得分:5)

WMIC正在返回两行,一行是printername,另一行是空行 解决方法是测试空行。

ECHO Gathering Installed Printer Information...
FOR /F "tokens=1 skip=1" %%A IN ('WMIC PRINTER WHERE "Servername like "%%printaz1%%"" get sharename') DO if not "%%A"=="" SET PRINTERNAME=%%A
ECHO %PRINTERNAME%

答案 1 :(得分:1)

你在寻找的是:

for /f "skip=2 tokens=2 delims=," %%A in ('WMIC PRINTER WHERE "Servername like "%%printaz1%%"" get sharename /format:csv') DO SET PRINTERNAME=%%A
ECHO %PRINTERNAME%

说明:

wmic的unicode输出包含一个由FOR / F捕获的回车符,这是你不想要的,因为这意味着'enter'成为变量的一部分(%% A),它还包含一个空行,再次输出到%% A。

我的示例执行以下操作: / format:cvs - 将输出逗号分隔输出,以便我们可以使用分隔符捕获, skip = 2 - 将跳过开头的空行并跳过csv的标题行。 tokens = 2 - csv输出包含名称,值作为输出,但您只需要value,这是第二个标记。

顺便说一下,因为我们不再将空间作为单独的空间包含在内,所以它甚至应该在值中使用空格。试一试。

答案 2 :(得分:1)

我绕过了UNICODE回车(这里真的是问题),就像这样:

@echo off
FOR /F "usebackq tokens=1,2 delims==" %%A IN (`wmic %* /VALUE ^| findstr "="`) DO (call :OUTPUT %%A "%%B")
exit /b

:OUTPUT
echo %1=%2

另存为“wmi.bat” 并执行您的查询:

wmi.bat printer where 'name like "HP%"' get name

我的输出如下:

Name="HP1C0BCA (HP Officejet Pro 276dw MFP)"
Name="HP Officejet Pro L7500 Series"
Name="HP Officejet Pro 276dw MFP PCL 6"

你可以想象你如何玩这个。 “%% B”部分将/ VALUE(包括空格)的所有输出放入%2 %% A捕获对象id,它变为%1,如果您使用它来记录来自WMI的各种信息,这将很方便。您不必再担心Unicode回车了。

这种方法的一大优点是你有一个聪明的批处理文件,它克服了wmic在脚本中使用它时给你的限制,你可以将它用于任何事情。 您可以使用批处理文件的STDOUT作为其他任何参数,即使是输入到wmic!

答案 3 :(得分:0)

@ECHO

ECHO Gathering Installed Printer Information...

FOR /F "tokens=1 skip=1" %%A IN ('WMIC PRINTER WHERE "Servername like "%%printaz1%%"" get sharename') DO (
  SET PRINTERNAME=%%A
  goto end
) 
:end
ECHO %PRINTERNAME%

答案 4 :(得分:0)

最安全和通用的变体是嵌套另一个for /F循环,如下所示:

for /F "skip=1 usebackq delims=" %%A in (`
    wmic Printer where 'Servername like "%%printaz1%%"' get ShareName
`) do for /F "delims=" %%B in ("%%A") do set "PRINTERNAME=%%A"

问题是wmic命令的Unicode输出和for /F对ANSI文本的转换不良,这会留下一些孤立的回车符,这反过来会让一些额外的行显示为非-empty。第二个for /F循环消除了这些转换假象。

我还将tokens=1选项替换为delims=,以便不在第一个空格处截断返回的项目。