2017-09-06 14 views
0

以下のコードでは、ステートメント内のforeachループを反復するために変数$scriptsを使用していました。しかし、$scriptの値が正しく置き換えられず、結果が "count.sql size.sql"という単一の文字列であるようです。 foreachループがInvoke-Commandループの外側で定義されている場合は、ループが正しく実行されています。PowerShellのInvoke-Commandの内部でforeachループを使用するには?

foreach内部にループを定義する方法はありますかInvoke-Command

$scripts = @("count.sql", "size.sql") 
$user = "" 
$Password = "" 
$SecurePassword = $Password | ConvertTo-SecureString -AsPlainText -Force 
$cred = New-Object System.Management.Automation.PSCredential -ArgumentList $User, $SecurePassword 

foreach ($server in $servers) { 
    Invoke-Command -ComputerName $Server -Credential $cred -ScriptBlock { 
     Param($server, $InputFile, $scripts, $url) 

     foreach ($script in $scripts) { 
      echo "$script" 
    } -ArgumentList "$server,"$scripts","$url" 
} 
+0

このスクリプト:

別の方法としては、usingscope modifierを経由してスクリプトブロックの外部からの変数を使用することができます。あなたはあなたの引数リストのようにあなたの編集が間違っているように見えるので、サーバのvarablesを正しく – ArcSet

+0

と呼んでいるようではありません。引数リストを -ArgumentList $ server、$ scripts、$ url に変更してください。すべてのarugmentsを順番に宣言していません....サーバ、入力ファイル、スクリプト、URL。現在は$ Scripts =〜$ inputfileです。 – ArcSet

+0

'-argumentList'パラメータも間違って配置されているように見えますが、現在はスクリプトブロック内にあります。 – andyb

答えて

0

私はあなたのコードの構文エラーは、あなたの質問に単にタイプミスであり、あなたの実際のコードには存在しないと仮定するつもりです。

あなたが記述した問題は、ネストされたforeachループとは関係ありません。これは、呼び出されたscriptblockに渡す引数を二重引用符で囲むことによって発生します。配列を二重引用符で囲むと、配列の値の文字列表現が、自動変数$OFS(デフォルトではスペース)で定義されたoutput field separatorで区切られた文字列に変換されます。この動作を避けるには、変数を二重引用符で囲む必要はありません。

変更するには、このような何かにInvoke-Command声明:

Invoke-Command -ComputerName $Server -Credential $cred -ScriptBlock { 
    Param($server, $scripts, $url) 
    ... 
} -ArgumentList $server, $scripts, $url 

、問題が消えます。完全に見えるdoesntの

Invoke-Command -ComputerName $Server -Credential $cred -ScriptBlock { 
    foreach ($script in $using:scripts) { 
     echo "$script" 
    } 
}
関連する問題