我试图通过批处理文件调用PS脚本,如此
Powershell.exe -file "C:\Scripts\Blah\Blah\Blah.ps1" -webUID "usernameValue" -webPWD "passwordValue" -Param "param value" -Param2 "param 2 value"
问题似乎是批处理文件让Param和Param2感到困惑。它认为我正在设置Param2 两次但是Param和Param2完全是单独的参数。有没有人经历过这个?有没有办法明确说明参数名称?感谢
Param block
# Parameters
Param
(
[string]$WebUID,
[string]$WebPWD,
[string]$Param,
[string]$Param2
)
答案 0 :(得分:2)
为了支持简洁的命令行使用,PowerShell的“弹性语法”允许指定参数名称的明确前缀子串,这样您只需要输入尽可能多的参数名称识别它没有歧义;
例如,如果没有其他参数以-p
开头,则输入-Path
来引用p
就足够了。
但是,始终会识别完全匹配,因此在您的案例中指定-Param
应该明确地匹配-Param
参数,即使它的全名恰好是不同参数-Param2
的前缀子字符串。
如果问题 是歧义问题(事实并非如此),您会看到不同的错误消息。例如,如果你使用含糊不清的-Para
,你会看到:
Parameter cannot be processed because the parameter name 'para' is ambiguous. Possible matches include: -Param -Param2.
相反, 您的错误消息的措辞表明完全相同的参数名称 - -Param2
- 确实已经多次指定 - 即使您的示例代码没有显示。
我已经测试了PSv2和PSv5.1 / 6.0 alpha 10中的行为 - 然而,可以想象其他版本由于错误而采取不同的行为。请告诉我们。
考虑替代方法:
如果您从PowerShell 中的调用了脚本,则可以使用单个数组值参数 - 例如[string[]] $Params
- 然后根据需要传递尽可能多的参数,以逗号分隔,而无需为每个值指定不同的参数名称。
可悲的是,从PowerShell 之外的调用脚本时,这种方法不起作用,因为外部不支持传递数组。
但是有一个解决方法:
声明用[parameter(ValueFromRemainingArguments=$true)]
使用参数作为空格分隔列表在命令的末尾调用脚本。
应用于您的场景:
如果您的脚本按如下方式定义其参数:
Param
(
[string]$WebUID,
[string]$WebPWD,
[parameter(ValueFromRemainingArguments=$true)]
[string[]] $Params
)
然后您可以按如下方式调用脚本:
Powershell.exe -file "C:\Scripts\Blah\Blah\Blah.ps1" `
-webUID "usernameValue" `
-webPWD "passwordValue" `
"param value" "param 2 value"
和$Params
会收到值数组:$Params[0]
会收到param value
,$Params[1]
会收到param 2 value
。
请注意,从PowerShell的外部进行调用时:
-Params
- 只需在结尾指定值。,
分隔值 - 使用空格。答案 1 :(得分:0)
我不是大师,但这看起来与"部分参数"相关。和"参数完成"。 See this article for more information
只需将Param
更改为Param1
即可解决问题。