【问题标题】:Unable to Delete Printer w/ Apostrophe (') Using PRNMNGR无法使用 PRNMNGR 删除带撇号 (') 的打印机
【发布时间】:2018-03-28 15:35:14
【问题描述】:

我有一台名为“Teacher's Lounge Printer”的打印机(注意撇号)

在标准 Windows 7 命令提示符下执行以下命令时,会出现“Error 0x8004103A Invalid object path”。

cscript "%WINDIR%\System32\Printing_Admin_Scripts\en-US\prnmngr.vbs" -d -p "Teacher's Lounge Printer"

如果我将打印机重命名为“Teachers Lounge Printer(不带撇号),那么不带撇号的命令将成功执行。

cscript "%WINDIR%\System32\Printing_Admin_Scripts\en-US\prnmngr.vbs" -d -p "Teachers Lounge Printer"

我觉得我已经尝试过双引号、单引号的所有组合,甚至尝试过转义字符。

最终,这将使它成为我正在编写的批处理脚本,但我首先需要让单个命令正常工作。

我知道我做错了什么,感谢任何帮助。

【问题讨论】:

  • 你试过\'吗?
  • 是的。 Unable to delete printer Teacher\'s Lounge Printer Error 0x8004103A Invalid object path

标签: batch-file command-line vbscript special-characters apostrophe


【解决方案1】:

Microsoft 的 prnmngr.vbs 脚本使用 WMI 来提供底层功能。

WMI 接受使用单引号 ' 或双引号 " 引用的字符串。不幸的是 prnmngr.vbs 的开发者选择在两个地方使用单引号,当打印机名称包含单引号(撇号)时会导致问题。

我还没有想出一种方法来以 WMI 接受的方式转义 prmnnger.vbs 参数中的'。但我已经想出了如何破解(调试)Microsoft prnmngr.vbs 代码以消除问题。

在我的机器上,第 462 行和第 818 行有两条相同的违规行。

        set oPrinter = oService.Get("Win32_Printer.DeviceID='" & strPrinter & "'")

可以通过切换到在 WMI 查询字符串中使用双引号来修复该错误。由于双引号文字位于 VBS 引用字符串中,因此引号必须转义为 ""

        set oPrinter = oService.Get("Win32_Printer.DeviceID=""" & strPrinter & """")

与其修改原始 Microsoft 文件,不如将文件复制到不同的文件夹中,并在那里进行更改,然后运行该破解版本而不是 Microsoft 原始文件。

【讨论】:

  • 我注意到prnmngr.vbs 在使用-x 参数时会正确删除带有撇号' 的打印机,该参数会删除所有打印机。我会看一下 VBS 文件,但我很好奇代码有何不同。
  • @wmbell - 删除特定打印机需要带有 where 子句的 WMI 查询,该子句将打印机的名称指定为带引号的值。查询返回指定的打印机对象。删除所有打印机只是迭代所有可用的打印机,而不需要 where 子句,因此没有引用值。
  • 看起来 -x 参数在每个 Win32_Printer 实例上使用 FOR EACH 循环,而不是按名称查询打印机。这可以解释为什么 -x 参数有效而 -d -p 参数无效。
  • 附带说明...看来这个确切的问题也存在于其他几个内置打印 VBS 文件中。
  • @dbenham 我试过你的技巧。仍然得到同样的错误。我有一家远程商店,认为他们通过将打印机重命名为“不使用”来很可爱。无法删除。
猜你喜欢
  • 2017-07-15
  • 2017-12-28
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 2013-07-25
  • 2020-06-19
  • 2018-01-14
  • 1970-01-01
相关资源
最近更新 更多