如何在PowerShell脚本中正确传递带大括号的DeviceID参数
如何在PowerShell脚本中正确传递带大括号的DeviceID参数
这个问题我之前也踩过坑!核心原因是PowerShell里的大括号{}有特殊用途——它既用来定义脚本块,又是通配符的一部分,直接传递的话会被解析器误处理,导致参数丢失或者变成null。下面给你几个可靠的解决办法:
一、分场景选择传递方式
场景1:从Cmd/外部终端调用PowerShell脚本
如果你是在Cmd提示符或者其他外部终端里用powershell.exe启动脚本,最稳妥的方式是用-Command参数,把脚本调用和参数整个用单引号包裹起来:
powershell.exe -Command ".\SwitchWindowsAudio.ps1 '{0.0.0.00000000}.{44c76b90-01ce-485c-8705-e93f9be4c435}'"
这样PowerShell会把单引号里的内容当成完整的字符串参数,不会解析里面的大括号。
场景2:在PowerShell内部直接调用脚本
这种情况更简单,直接用单引号把DeviceID包起来就行——单引号在PowerShell里是「原样字符串」,不会处理任何特殊字符:
.\SwitchWindowsAudio.ps1 '{0.0.0.00000000}.{44c76b90-01ce-485c-8705-e93f9be4c435}'
二、给脚本定义明确的参数(推荐)
与其用$args[0]这种模糊的方式接收参数,不如给脚本加上参数定义,这样不仅更清晰,还能避免参数解析的坑。比如在脚本开头加上:
param( [string]$DeviceID # 明确指定参数类型为字符串 )
然后调用的时候可以指定参数名,更不容易出错:
# PowerShell内部调用 .\SwitchWindowsAudio.ps1 -DeviceID '{0.0.0.00000000}.{44c76b90-01ce-485c-8705-e93f9be4c435}' # 外部终端调用 powershell.exe -Command ".\SwitchWindowsAudio.ps1 -DeviceID '{0.0.0.00000000}.{44c76b90-01ce-485c-8705-e93f9be4c435}'"
三、验证参数是否正确传递
你可以先在脚本里加几行代码验证参数是否正常接收,比如:
param( [string]$DeviceID ) Write-Host "收到的DeviceID:$DeviceID" Write-Host "参数类型:$($DeviceID.GetType().Name)"
如果这里能正确打印出你的DeviceID,那后续调用Get-AudioDevice -ID $DeviceID肯定就能正常工作了。
为什么之前的方法不行?
- 直接不带引号传递:PowerShell会把
{}当成脚本块或通配符解析,导致参数被拆分甚至丢失,所以$args里是空的。 - 用双引号包裹但没转义:双引号里的
{0}会被PowerShell当成格式化字符串的占位符,直接解析成空值,所以参数变成了null。
备注:内容来源于stack exchange,提问作者Jonathan Styles




