2017-09-06 72 views
0

在下面的代碼中,我使用$scripts變量遍歷Invoke-Command語句中的foreach循環。但$script值不能正確替換,並且結果似乎是單個字符串,因爲「count.sql size.sql」。如果在Invoke-Command循環之外定義,則foreach循環正在正確執行。如何使用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

這個腳本does not看起來完整。你似乎沒有正確地調用服務器上的可變參數 – ArcSet

+0

,因爲你的編輯看起來像你的參數列表是錯誤的。您正在使用「在他們周圍將所有變量聲明爲字符串。將參數列表更改爲 -ArgumentList $ server,$ scripts,$ url 另外您還沒有按順序聲明所有的arugments ....服務器,輸入文件,腳本,URL。目前$ Scripts是= to $ inputfile – ArcSet

+0

'-argumentList'參數也看起來被錯誤地放置,它當前在腳本塊內 – andyb

回答

0

我打算假設您的代碼中的語法錯誤只是您的問題中的拼寫錯誤,並不存在於您的實際代碼中。

您描述的問題與嵌套的foreach循環無關。它是由你傳遞給被調用的腳本塊的參數引起的雙引號造成的。將數組放入雙引號將數組轉換爲一個字符串,其中字符串表示由自變量$OFS(缺省爲空格)中定義的output field separator分隔的數組中的值。爲了避免這種行爲,當不需要時,不要將變量放在雙引號中。

更改Invoke-Command聲明是這樣的:

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

,問題就會消失。

另外,您可以通過usingscope modifier使用從腳本塊以外的變量:

Invoke-Command -ComputerName $Server -Credential $cred -ScriptBlock { 
    foreach ($script in $using:scripts) { 
     echo "$script" 
    } 
}