Powershell &引用;无法绑定参数,因为Param2被多次指定";
我试图通过批处理文件调用PS脚本,如下所示Powershell &引用;无法绑定参数,因为Param2被多次指定";,powershell,batch-file,parameters,parameter-passing,Powershell,Batch File,Parameters,Parameter Passing,我试图通过批处理文件调用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是完全不同的参数。有人经历过吗?是否有一种方法可以
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是完全不同的参数。有人经历过吗?是否有一种方法可以显式声明参数名称?谢谢
参数块
# Parameters
Param
(
[string]$WebUID,
[string]$WebPWD,
[string]$Param,
[string]$Param2
)
我不是大师,但这似乎与“部分参数”和“参数完成”有关
只需将
Param
更改为Param1
就可以解决这个问题。为了支持简洁的命令行使用,PowerShell的“弹性语法”允许指定参数名称的明确前缀子字符串,这样您只需键入尽可能多的参数名称就可以识别它而不会产生歧义e、 例如,如果没有其他参数以
p
开头,则键入-p
以引用-Path
就足够了
但是,始终可以识别精确匹配,因此在您的示例中指定-Param
应该与-Param
参数明确匹配,即使其全名恰好是不同参数-Param2
的前缀子字符串
如果问题是不明确的问题(不是),您会看到不同的错误消息。例如,如果您使用不明确的-Para
,您会看到:无法处理参数,因为参数名称“para”不明确。可能的匹配项包括:-Param-Param2。 相反,错误消息的措辞表明确实多次指定了完全相同的参数名--
-Param2
,,即使示例代码没有显示
我已经在PSv2和PSv5.1/6.0 alpha 10中测试了这种行为——但是,可以想象,其他版本由于一个bug而表现出不同的行为。一定要让我们知道
考虑一种替代方法: 如果从PowerShell中调用脚本,则可以使用单个数组值参数(例如,
[string[]]$Params
),然后只需传递所需数量的参数,以逗号分隔,而无需为每个值指定不同的参数名
遗憾的是,当从PowerShell外部调用脚本时,这种方法不起作用,因为外部不支持传递数组
但是,有一个解决办法:
- 声明用
[参数(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"
然后可以按如下方式调用脚本:
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]
将接收参数值
,$Params[1]
将接收参数2值
请注意,从PowerShell外部调用时:
- 在调用中不能使用参数名
,只需在末尾指定值即可-Params
- 不能使用
分隔值-使用空格,
param()
块吗?我添加到了OP中。每个参数只指定一次。然而,当我从批处理调用中删除Param时,它就可以工作了。这就是为什么我认为它将参数读取为通配符值,并将Param与Param2混淆如果在Param()
块之前添加[CmdletBinding()]
,它会改变它吗?相同的错误消息:/I无法使用发布的代码在此处复制它。批处理文件中一定有什么东西弄乱了参数。可能是,但不应该是因为部分。您需要一个不含糊的部分参数。我来读一下这篇文章。感谢您回复@briantist的评论:由于-Param
是一个精确匹配,因此没有歧义,PowerShell可以识别它-即使参数名恰好是另一个参数名的子字符串(尽管这是一种需要避免的做法)。