Nik*_*wal 2 c# powershell cakebuild
我有一个具有string[]参数的powershell脚本,并尝试从批处理文件中将值传递给它
PowerShell脚本
[string[]]$ScriptArgs
Run Code Online (Sandbox Code Playgroud)
批处理文件
powershell -File Foobar.ps1 -ScriptArgs -versn="""1.0.0.0""",pattern="""FooBar.*"""
Run Code Online (Sandbox Code Playgroud)
(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%
Run Code Online (Sandbox Code Playgroud)
但是控制台会以某种方式运行,就像未创建变量一样,并以
powershell -File Foobar.ps1 -ScriptArgs
Run Code Online (Sandbox Code Playgroud)
并引发错误
缺少参数'ScriptArgs'的参数。指定类型的参数,
System.String[]然后重试
我应该改变些什么来实现这一目标?
当调用一个PowerShell脚本从一个批处理文件(来自cmd.exe)与-File,有没有 办法直接值数组传递到一个PowerShell 阵列参数:
如果您指定不带空格的数组值,则将它们视为SINGLE元素;例如:
one,two,three 成为单个数组元素如果确实使用空格,则尾部逗号将成为参数的一部分,并且只有FIRST值绑定到array参数:
one, two, three- one,包括尾随,-成为唯一的数组元素,two,并被three,视为单独的参数。该解决方法是:
无论是:使用-Command调用脚本-见底部。
或者,使用-File,以不同的方式声明参数并以不同的方式传递参数:
[Parameter(ValueFromRemainingArguments)]在您的情况下:
声明参数:
[Parameter(ValueFromRemainingArguments)]
[string[]] $ScriptArgs
Run Code Online (Sandbox Code Playgroud)使用不带参数名称的单独的,以空格分隔的参数来调用脚本,以将它们作为数组绑定到:$ScriptArgs
powershell -File Foobar.ps1 "-versn=\"1.0.0.0\"" "pattern=\"FooBar.*\""
Run Code Online (Sandbox Code Playgroud)
请注意以下引用:
每个参数作为一个整体都包含在其中"..."-严格来说不是必须的,但是要防止使用- -前缀值,例如-version被误认为参数名。
"字符 如要保留文字被\转义(其与对比`,必须从使用-escaping 内的PowerShell)。
这种方法的固有局限性:
该方法不支持多个数组参数,因为只有一个可以用修饰ValueFromRemainingArguments。
您不能在位置上传递任何其他参数(即,必须在参数之前传递其参数名称传递给其他参数)。
替代方法:使用-Command代替-File:
powershell -command "./Foobar.ps1 '-versn=\"1.0.0.0\"', '-pattern=\"FooBar.*\"'"
Run Code Online (Sandbox Code Playgroud)
注意:
传递给您的-Command内容被视为一段PowerShell代码 -无论您传递的是单个参数还是多个参数-在后一种情况下,它们都简单地用空格连接起来,然后将结果解释为PowerShell代码。
含义是:
要在当前目录中执行脚本,必须使用路径(.\)引用该脚本-才能执行该脚本。
&调用运算符进行调用;例如,& '.\Foo Bar.ps1'您可以通过数组参数像往常一样,除了那个"字符。必须再次逃脱\",不是`"。
还要注意的是再次的论点被引用作为一个整体(太),在这种情况下是需要的,以防止PowerShell与解释-versn,并-pattern作为参数名称。
"...",使用"仍然有可能执行嵌入的报价,这很尴尬,因为您必须将 \ -和- `转义结合起来;例如,\"-pattern=`\"FooBar.*`\"\"通常,请注意所有常用的PowerShell解析规则都适用,例如,要使用文字 $,您必须将其转义为`$。