我有一个使用多个参数的脚本,其中一些参数包含空格。该脚本是从另一个脚本调用的,因此我使用调用脚本从变量传递参数。
调用脚本:
$script = "C:\Path\script.ps1"
$arg1 = "SomeValue"
$arg2 = "1234"
$arg3 = @("Value1","Some Value","Value 2")
$arg4 = $true
Invoke-Command $script -Arg1 $arg1 -Arg2 $arg2 -Arg3 $arg3 -Arg4 $arg4
被调用的脚本如下所示:
param (
[Parameter(Mandatory=$false,Position=0)]
[String]$arg1,
[Parameter(Mandatory=$false,Position=1)]
[String]$arg2,
[Parameter(Mandatory=$false,Position=2)]
[array]$arg3,
[Parameter(Mandatory=$false,Position=3)]
[bool]$arg4
)
# Do stuff with the arguments
当我调用脚本时,出现以下错误:
"A positional parameter cannot be found that accepts argument 'Some'."
我还在PowerShell窗口中手动调用脚本(绕过调用脚本),如下所示:
powershell.exe -ExecutionPolicy bypass C:\Path\script.ps1 -Arg1 "SomeValue" -Arg2 "1234" -Arg3 @("Value1","Some Value","Value 2") -Arg4 $true
powershell.exe -ExecutionPolicy bypass C:\Path\script.ps1 -Arg1 "SomeValue" -Arg2 "1234" -Arg3 "Value1","Some Value","Value 2" -Arg4 $true
powershell.exe -ExecutionPolicy bypass C:\Path\script.ps1 -Arg1 "SomeValue" -Arg2 "1234" -Arg3 "Value1","SomeValue","Value2" -Arg4 $true
powershell.exe -ExecutionPolicy bypass C:\Path\script.ps1 -Arg1 "SomeValue" -Arg2 "1234" -Arg3 "Value1,SomeValue,Value2" -Arg4 $true
这些变化都不起作用。我还通过将Arg3值更改为(,$ args)来尝试找到here的想法,但这并不起作用。我还将参数类型更改为找到here,但这也没有。
目标是能够通过参数/参数将多个变量(一些带空格)传递给脚本。
编辑12/22/16 :目标包括从快捷方式/类型命令传递相同的信息。例如,我的调用脚本在注册表中创建一个RunOnce条目以引用被调用的脚本,并将参数放在调用中,就像上面的手动示例一样。它们都不起作用。
Set-ItemProperty $RegROPath "(Default)" -Value "powershell.exe -ExecutionPolicy Bypass $scriptPath $argumentList" -type String
答案 0 :(得分:2)
将Invoke-Command
替换为&
或.
如果您希望输出所有内容,请&
使用.
,如果您希望它在当前上下文中运行(例如,保留所有变量设置)
Get-Help about_Scripts
了解更多详情(或阅读online version here)
编辑:忘记提及,不是您的脚本引发了该错误,而是Invoke-Command
。如果您必须使用Invoke-Command
,您需要(例如远程运行)将参数作为参数ArgumentList
传递,如下所示:
$script = "C:\Path\script.ps1"
$argumentList = @(
'-arg1 "SomeValue"',
'-arg2 1234',
'-arg3 @("Value1","Some Value","Value 2")',
'-arg4 $true'
)
Invoke-Command -FilePath $script -ArgumentList $argumentList
编辑2:
我会尽快尝试你的建议。一个问题,如果我需要添加条件参数怎么办?目前,我使用$ argumentlist + =(“arg5”,“value”)向列表添加参数。其中一些是有条件的:if($ bool){$ argumentlist + =(“arg5”,“value”)}。在你的例子中有没有办法做到这一点?
是的,你可以,示例中的$argumentList
变量就像任何其他变量一样。它可以一次定义,定义为空并添加到以后,或任何混合。
实施例
$argumentList = @(
'-arg1 "SomeValue"',
'-arg2 1234',
'-arg3 @("Value1","Some Value","Value 2")',
'-arg4 $true'
)
if ($bool) {
$argumentList += '-arg5 "value"'
}
Invoke-Command -FilePath $script -ArgumentList $argumentList
但是,除非您在远程计算机或PSSession上运行命令,否则应使用&
或点源(.
)。您仍然可以使用splatting(about_Splatting)
实施例
$scriptParamsSplat = @{
arg1 = "SomeValue"
arg2 = 1234
arg3 = @("Value1","Some Value","Value 2")
arg4 = $true
}
if ($bool) {
$scriptParamsSplat.arg5 = "value"
}
& 'C:\Path\To\script.ps1' @scriptParamsSplat