如何在PowerShell中的Invoke-Command中使用foreach循环?

时间:2017-09-06 03:07:37

标签: powershell powershell-v4.0

在下面的代码中,我使用$scripts变量来遍历foreach语句中的Invoke-Command循环。但是$script值没有正确替换,结果似乎是单个字符串为" count.sql size.sql"。如果在foreach循环之外定义,Invoke-Command循环正在正确执行。

是否有任何特定方法可以在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"
}

1 个答案:

答案 0 :(得分:2)

我将假设您的代码中的语法错误只是您问题中的拼写错误,并且不会出现在您的实际代码中。

您描述的问题与嵌套的foreach循环无关。它是由您传递给调用的scriptblock的参数的双引号引起的。将数组放在双引号中会将数组变成一个字符串,其中字符串中的值的字符串表示由自动变量$OFS中定义的output field separator分隔(默认情况下为空格)。为避免此行为,在不需要时不要将变量放在双引号中。

Invoke-Command语句更改为以下内容:

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

问题就会消失。

或者,您可以通过using scope modifier使用脚本块外部的变量:

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