Powershell:将多个值(带空格)传递给参数

时间:2016-12-21 23:55:31

标签: powershell

我有一个使用多个参数的脚本,其中一些参数包含空格。该脚本是从另一个脚本调用的,因此我使用调用脚本从变量传递参数。

调用脚本:

$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

1 个答案:

答案 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