PowerShell for-each循环的逻辑

时间:2017-08-29 15:55:37

标签: powershell

我使用下面的powershell脚本来循环遍历列表中的服务器,以根据服务器的主机名执行特定任务。在下面的脚本中,如果$ server =' server1'与其他服务器相比,我想执行不同的任务集,但是这个循环直接执行'否则'环。我在这里错过了什么?

$servernames = @("server1", "server2", "server3")
$user = '**********'
$Password = '*******'
$SecurePassword = $Password | ConvertTo-SecureString -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential -ArgumentList $user, $SecurePassword

foreach($server in $servernames)
{
    Invoke-Command -ComputerName $server -Credential $cred -ScriptBlock {          
        if ($server -eq 'server1')
        {
            #do some task on server1
        }
        else
        {
            #do tasks for remaining servers
        }
    } 

    if ($error) { exit 1 }
}

3 个答案:

答案 0 :(得分:1)

由于_resources位于invoke命令的脚本块内,因此该范围内不存在$Server。您可以使用-Argumentlist或“使用”范围(PS3 +)传递它,例如if ($using:server -eq 'server1')但将if语句置于Invoke-Command之外可能更有意义。

if ($server -eq 'server1') {
    Invoke-Command -ComputerName $server -Credential $cred -ScriptBlock { 
        "Stuff to do on Server1"
    }
} else { "Other Servers"}

答案 1 :(得分:1)

您的scriptblock属于不同的范围,但看不到$server。我建议在执行命令之前弄清楚你的逻辑。

If ($Server -eq 'server1')
{ Invoke-Command -ComputerName $Server -Credential $Cred -ScriptBlock {} }

答案 2 :(得分:0)

$server变量的值一旦传递到远程系统就超出了范围。为防止这种情况发生,您需要传递所需的参数。为此,您将用作函数的脚本块视为函数并为其定义参数,然后使用ArgumentList Invoke-Command参数传递值:

foreach ($server in $servernames) {
    Invoke-Command -ComputerName $server -Credential $cred -ScriptBlock {          
        Param($server)
        if ($server -eq 'server1') {
            #do some task on server1
        }
        else {
            #do tasks for remaining servers
        }
    } -ArgumentList $server

    if ($error) { exit 1 }
}

为了更清楚一下发生了什么,我将重命名脚本块使用的参数:

foreach ($server in $servernames) {
    Invoke-Command -ComputerName $server -Credential $cred -ScriptBlock {          
        Param($MyServer)
        if ($MyServer -eq 'server1') {
            #do some task on server1
        }
        else {
            #do tasks for remaining servers
        }
    } -ArgumentList $Server

    if ($error) { exit 1 }
}