Set-PSDebug -Trace 2导致PowerShell变量赋值失败,是否为预期行为?
问题:Set-PSDebug -Trace 2 导致Start-Process赋值失败
当执行以下PowerShell脚本时,若设置调试跟踪级别为2会直接报错:
Set-PSDebug -Trace 2 $Process = Start-Process -FilePath ping -ArgumentList localhost -NoNewWindow -PassThru -Wait
报错信息如下:
Cannot convert value to type System.String. At line:1 char:1 + $Process = Start-Process -FilePath ping -ArgumentList localhost -NoNe ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [], RuntimeException + FullyQualifiedErrorId : InvalidCastFromAnyTypeToString
相关现象:
- 设置
-Trace 1或不启用跟踪时,脚本可正常运行; - 在
-Trace 2模式下,若不对$Process进行变量赋值,脚本也能正常执行。
用户疑问:Set-PSDebug不应修改执行环境,该现象是预期行为还是PowerShell的bug?
使用的PowerShell版本信息:
PS C:\Users\Eric> $PSVersionTable Name Value ---- ----- PSVersion 5.1.19041.2364 PSEdition Desktop PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...} BuildVersion 10.0.19041.2364 CLRVersion 4.0.30319.42000 WSManStackVersion 3.0 PSRemotingProtocolVersion 2.3 SerializationVersion 1.1.0.1
结论与说明
- 这是PowerShell 5.1的已知bug,并非预期行为。
- 触发原因:启用
Set-PSDebug -Trace 2后,PowerShell的底层跟踪逻辑会干扰Start-Process -PassThru返回的System.Diagnostics.Process对象的赋值流程,错误地尝试将该对象强制转换为字符串类型,进而抛出类型转换异常。 - 临时解决办法:
- 若必须保留
-Trace 2跟踪,可以将赋值操作放在子作用域中执行,避免跟踪逻辑干扰:Set-PSDebug -Trace 2 & { $Process = Start-Process -FilePath ping -ArgumentList localhost -NoNewWindow -PassThru -Wait } - 或者调整执行顺序,先完成
Start-Process的赋值操作,再启用调试跟踪。
- 若必须保留
内容的提问来源于stack exchange,提问作者atomicpirate
相关产品推荐
相关产品推荐

