【问题标题】:Powershell error if the hardware is not there如果硬件不存在,则 Powershell 错误
【发布时间】:2021-07-28 17:30:56
【问题描述】:

我正在尝试获取一个 powershell 脚本来查看我是否连接了 USB 扫描仪。

如果它在那里,它就像我需要的那样工作,如果它不是它会出错。

我希望能够让它结束,或者让我知道没有连接扫描仪。

不存在时冒犯的线路是:

$USBscanner = wmic path CIM_LogicalDevice where "DeviceID like 'USB\\VID_0C2E%' and DeviceID like 'USB\\%PID_0B01%' and Description like 'USB Composite Device%'" get /value

【问题讨论】:

  • 顺便说一句:wmic.exe 已被正式弃用,wmic /? 以红色打印 WMIC is deprecated 作为第一行(非空)就证明了这一点。考虑改用 PowerShell 的 CIM cmdlet,例如 Get-CimInstance,它具有返回对象而不是文本的额外优势,以便进行稳健的后续处理。

标签: powershell usb barcode-scanner


【解决方案1】:

在继续执行脚本之前,您始终可以检查您的变量是否有任何数据,并提前结束它:

if (-not $USBscanner) { Throw 'USB Scanner not found!' }

或者您可以让所有错误都根据偏好终止您的脚本:

$ErrorActionPreference = 'Stop'

如果你不想仅仅终止脚本,你可以trycatch 来自wmic.exe 的错误:

Try {
  $ErrorActionPreference = 'Stop'
  wmic path CIM_LogicalDevice WHERE 'DeviceID="MissingDevice"'
}
Catch {
  Write-Warning 'USB Scanner not found'
}

作为建议,您最好将 CIM 的实际 Powershell cmdlet 与上面的 if 语句一起使用。这些命令返回 powershell 用来操作的实际对象:

# check if USB scanner device is attached:
$USBscanner = Get-CimInstance -ClassName CIM_LogicalDevice | 
    where {$_.DeviceID -Like 'USB\VID_0C2E*' -and $_.DeviceID -like 'USB\*PID_0B01*'}

if (-not $USBscanner) { Throw 'USB Scanner not found!' }

【讨论】:

  • 谢谢 Cpt。鲸鱼,这让我到达了我想去的地方!
  • @Chrisj105,很高兴听到!请将其标记为答案,或者您有任何问题吗?
  • 好建议,除了try / catch 解决方案不起作用,因为$ErrorActionPreference外部程序的调用没有影响。请检查automatic $LASTEXITCODE variable。 OP 的 wmic 查询字符串 可以 - 并且应该,为了提高效率 - 按原样传递给 Get-CIMInstance-Filter 参数,除了它碰巧有一个逻辑缺陷(@987654336 @ 而不是 or,然后修复它需要嵌入 (...))。
  • @mklement0 啊,谢谢! try/catch 在远程处理或在 ISE 中确实有效,因为 wmic 在那里返回一个通用的[NativeCommandError] 异常(但不是在正常的控制台窗口中,哎呀)。你也对-Filter 标志更有效,但它仍然应该是and(第二个字符串有两个通配符)。
  • 了解and(我草草下结论)。不幸的是,ISE 和远程处理/后台作业/线程作业通过 PowerShell 的 错误流 路由 stderr 输出,这是不合适的。 v7.2 的预览版(显然不包括仅 WinPS、过时的 ISE)现在具有 PSNotApplyErrorActionToStderr 实验性功能(在预览版中默认启用),它修复了这个问题,并且这个修复有望进入下一个释放。无论哪种方式,都不建议依赖损坏的行为,尤其是考虑到常规游戏机不会出现这种情况。
猜你喜欢
  • 2017-06-28
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
相关资源
最近更新 更多