2016-12-21 395 views
2

複数の引数を使用するスクリプトがあり、その中には空白が含まれています。スクリプトは別のスクリプトから呼び出されます。したがって、呼び出し元のスクリプトの変数から引数を渡します。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のようにパラメータの種類を変更しましたが、それもうまくいきませんでした。

目的は、引数/パラメータを使用して複数の変数(スペースを含む)をスクリプトに渡すことです。

EDIT 12/22/16:この目標には、ショートカット/入力コマンドから同じ情報を渡すことが含まれます。たとえば、私の呼び出しスクリプトは、呼び出されたスクリプトを参照するためにレジストリにRunOnceエントリを作成し、上の手動の例と同様に引数を呼び出しに配置します。それらのどれも働かない。用

Set-ItemProperty $RegROPath "(Default)" -Value "powershell.exe -ExecutionPolicy Bypass $scriptPath $argumentList" -type String 
+0

'たpowershell.exe -ExecutionPolicyバイパス - % "C:\パス\ script.ps1 -arg1 \" someValueの\」 -Arg2 \ "1234 \" --Arg3 \ "値1 \"、\ "一部の値\"、\ "値2 \" -Arg4 $ true "' – PetSerAl

+0

こんにちはPetSerAl、私はこれをプログラム的に構築するので、スプラット配列から来る。 – McKenning

+0

できます。どこでも適切なエスケープを適用するだけです。 – PetSerAl

答えて

2

あなたが望むすべてを出力し、.ある場合は、それが現在のコンテキストで実行したい場合(例えば設定されているすべての変数を保持)&または.

使用&Invoke-Commandを交換し

Get-Help about_Scripts詳細(またはonline version hereを読んでください)

編集: Fo言いたいことは、そのエラーをスローしているのはあなたのスクリプトではない、それはInvoke-Commandだ。

$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:

I will try your suggestion as soon as I am able to. One question, what if I need to add a conditional argument? Currently, I add arguments to the list with $argumentlist += ("arg5", "value"). Some of them are conditional: if ($bool) {$argumentlist += ("arg5", "value")}. Is there a way to do that in your example?

はいすることができます、あなたは絶対にあなたは、このようなパラメータArgumentListとして引数を渡すために(例えばリモートで実行)必要Invoke-Command使用する必要がある場合この例の変数$argumentListは、他のどのような配列でもあります。すべてを一度に定義したり、空に定義したり、後で追加したり、任意の組み合わせで定義することができます。リモートコンピュータまたはのPSSessionでコマンドを実行している場合を除き

$argumentList = @(
    '-arg1 "SomeValue"', 
    '-arg2 1234', 
    '-arg3 @("Value1","Some Value","Value 2")', 
    '-arg4 $true' 
) 
if ($bool) { 
    $argumentList += '-arg5 "value"' 
} 
Invoke-Command -FilePath $script -ArgumentList $argumentList 

しかし、再び、あなたは&またはドットソーシング(.)を使用する必要があります。あなたはまだ条件付きスプラッティング(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 
+0

私はできるだけ早くあなたの提案を試みます。 1つの質問、条件付き引数を追加する必要がある場合はどうすればよいですか?現在、$ argumentlist + =( "arg5"、 "value")を使ってリストに引数を追加します。それらのうちのいくつかは条件付きです:if($ bool){$ argumentlist + =( "arg5"、 "value")}あなたの例でそれを行う方法はありますか? – McKenning

+0

実際には、例を含めるように更新できます。 –

+0

引数のスプラットを使用したスクリプト呼び出しで、「パラメータ 'Arg3'で引数変換を処理できません。値をSystem.String型に変換できません」。また、呼び出し元のスクリプトは、スクリプトに対するRunOnce呼び出しを作成して再起動します。スクリプトを再度呼び出すと、同じエラーが発生します(元の記事のマニュアルの例を参照)。 RunOnce/shortcut/Scheduled Taskからの引数として、(スペースで)値の配列を取得するにはどうすればよいですか? – McKenning

関連する問題