2

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

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

WMIC 打印机,其中 "SERVERNAME LIKE '%%OLDSERVERNAME%%'" 删除

我被问到是否可以让它替换打印机或更新它们以使帮助台免于收到“如何添加我的打印机”电话

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

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

这是我的脚本

@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

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

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 也不是不可能的选择,我对两者都很熟悉,这似乎是可能的,我真的不想重新开始。

4

5 回答 5

5

WMIC 返回两行,一行带有打印机名称,另一行为空。
对此的解决方案是测试空行。

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%
于 2012-10-20T14:02:27.113 回答
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 捕获的回车,这是您不想要的,因为这意味着“输入”成为变量 (%%A) 的一部分,并且它还包含一个空行,将再次输出到 %%A。

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

顺便说一句,因为我们不再将空格单独包含在内,它甚至应该在值中使用空格。试试看。

于 2013-06-12T08:14:37.097 回答
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 捕获对象 i​​d,它变成 %1 如果您使用它来记录来自 WMI 的各种信息,这很方便. 您不必再担心 Unicode 回车了。

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

于 2013-09-21T12:57:02.130 回答
1

最安全和通用的变体是嵌套另一个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 输出和 ANSI 文本的不良转换for /F,这留下了一些孤立的回车字符,这反过来又让一些额外的行显示为非空。第二个for /F循环摆脱了这些转换伪影。

我还替换了该tokens=1选项delims=,以免在第一个空格处截断返回的项目。

还请查看用户dbenham的以下相关答案:

于 2017-02-13T07:59:59.827 回答
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%
于 2015-01-28T19:58:27.817 回答