Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell &引用;无法绑定参数,因为Param2被多次指定";_Powershell_Batch File_Parameters_Parameter Passing - Fatal编程技术网

Powershell &引用;无法绑定参数,因为Param2被多次指定";

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是完全不同的参数。有人经历过吗?是否有一种方法可以

我试图通过批处理文件调用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是完全不同的参数。有人经历过吗?是否有一种方法可以显式声明参数名称?谢谢

参数块

# 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可以识别它-即使参数名恰好是另一个参数名的子字符串(尽管这是一种需要避免的做法)。