PowerShell 5.1:命令行切换DEBUG/Information日志为何不生效?
这问题我在帮别人排查PS脚本时碰到过好多次,其实是PowerShell 5.1的一个“特性”导致的,咱们一步步说清楚:
首先,你没操作错,但PowerShell 5.1里的命令行通用参数(比如-Debug、-InformationAction)默认不会自动作用于脚本内部的Write-* cmdlet——这和PowerShell 6及以后的版本不一样,很容易踩坑。
为什么直接加参数没用?
当你运行.\yourscript.ps1 -Debug时,这个-Debug参数其实是传递给脚本进程的,但如果脚本没有显式声明支持Cmdlet绑定,PowerShell 5.1不会把这个参数的设置传递给脚本内部的Write-Debug这类命令。而Write-Warning之所以能正常显示,是因为默认的$WarningPreference就是Continue,不需要额外触发。
解决方法有两种:
方法一:修改脚本,让它支持通用参数
在脚本最开头加上[CmdletBinding()]和空的param块,这样脚本就会继承PowerShell的通用参数,命令行传入的开关就能直接覆盖偏好变量:[CmdletBinding()] param() Write-Verbose "This is verbose" Write-Debug("This is debug") Write-Information("This is information") Write-Warning "This is warning"之后你运行
.\yourscript.ps1 -Debug -Verbose -InformationAction Continue,就能看到所有对应的输出了。方法二:临时设置偏好变量再调用脚本
如果不想修改脚本,可以在调用前临时调整全局偏好变量,比如:$DebugPreference = 'Continue'; $InformationPreference = 'Continue'; $VerbosePreference = 'Continue'; .\yourscript.ps1这样脚本运行时就会使用这些临时设置,显示对应的日志内容。
补充说明
你之前的认知(命令行开关覆盖变量)在PowerShell 6+版本里是成立的,因为微软在后续版本优化了这个逻辑,通用参数会自动影响脚本内的Write-*行为,但5.1作为旧版本还保留了原来的规则。
内容的提问来源于stack exchange,提问作者Jon Anthony

