我有一个powershell脚本,它有一个string[]
参数,并尝试从批处理文件中传递值
PowerShell脚本
[string[]]$ScriptArgs
批处理文件
powershell -File Foobar.ps1 -ScriptArgs -versn="""1.0.0.0""",pattern="""FooBar.*"""
(3行情 - 逃避/显示1个报价)
但无论我做什么Write-Host $ScriptArgs.Count
打印1
我希望变量接收2个元素
[0]
将为-versn="1.0.0.0"
[1]
将为-pattern="FooBar.*"
在批处理文件中,我甚至尝试单独设置变量
set @sArgs = -versn="""1.0.0.0"""
set @sArgs = %sArgs%;-pattern="""FooBar.*"""
powershell -File Foobar.ps1 -ScriptArgs %sArgs%
但是控制台以某种方式运行,好像没有创建变量并将其作为
运行powershell -File Foobar.ps1 -ScriptArgs
并抛出错误
缺少参数' ScriptArgs'的参数。指定
System.String[]
类型的参数,然后重试
我应该改变什么来实现这个目标?
答案 0 :(得分:4)
使用cmd.exe
从批处理文件(来自-File
)调用PowerShell脚本时,有没有 直接将值数组传递给PowerShell 数组参数的方式:
如果指定不带空格的数组值,则将它们视为SINGLE元素; e.g:
one,two,three
成为SINGLE数组元素如果使用空格,尾随逗号将成为参数的一部分,只有FIRST值绑定到数组参数:
one, two, three
- one,
- 包括尾随的,
- 成为仅的数组元素,two,
和three,
被视为分开参数。变通办法是:
:使用-Command
来调用脚本 - 请参阅底部。
或者,使用-File
,以不同方式声明参数并以不同方式传递参数:
[Parameter(ValueFromRemainingArguments)]
强> 在你的情况下:
声明参数:
[Parameter(ValueFromRemainingArguments)]
[string[]] $ScriptArgs
使用单独的,空格分开的参数调用脚本,前面没有参数名称,将它们作为数组绑定到$ScriptArgs
:< / p>
powershell -File Foobar.ps1 "-versn=\"1.0.0.0\"" "pattern=\"FooBar.*\""
请注意引用:
每个参数作为一个整体都包含在"..."
中 - 这不是绝对必要的,而是防范-
- 前缀值,例如{{1}被误认为是参数名称。
-version
字符。要保留为文字 "
- 转义(与\
形成鲜明对比 - 必须在 PowerShell中使用转义)。
此方法的固有限制:
方法不支持多个数组参数,因为只有一个可以使用`
进行修饰。
您无法传递任何其他参数位置 (即,您必须在参数之前传递给其他参数及其参数名称)。
替代方法:使用ValueFromRemainingArguments
代替-Command
:
-File
注意:
您传递给powershell -command "./Foobar.ps1 '-versn=\"1.0.0.0\"', '-pattern=\"FooBar.*\"'"
的内容被视为一段PowerShell代码 - 无论您是传递单个参数还是多个< / em> ones - 在后一种情况下,它们只是用空格连接,结果然后被解释为PowerShell代码。
其含义是:
要在当前目录中执行脚本,必须使用路径(-Command
)引用它 - 以便执行它。
.\
调用它;例如,&
您可以像往常一样传递数组参数,除了 & '.\Foo Bar.ps1'
个字符。必须再次转发为"
,而不是\"
。
另请注意,参数再次引用作为一个整体(也是),在这种情况下必需以阻止PowerShell解释{{1} }和`"
作为参数名称。
-versn
内传递,使用-pattern
执行嵌入式引用(仍然可能)是非常尴尬的,因为您必须合并 "..."
- 和"
- 逃避;例如,\
通常,请注意所有常用的PowerShell解析规则都适用,例如,要使用文字 `
,您必须将其转义为{{1} }。