我正在尝试使用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也不是不可选择的,我对两者都很熟悉,这似乎是可能的,我真的不想重新开始。
答案 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=
,以便不在第一个空格处截断返回的项目。