在下面的代码中,我使用$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"
}
答案 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"
}
}