2017-08-29 78 views
0

我正在使用下面的powershell脚本循环通过列表中的服务器执行特定的任务取决于服务器的主机名。在下面的脚本中,如果$ server ='server1'我想执行与其他服务器不同的一组任务,但是这个循环直接执行'else'循环。我在这里错过了什么?PowerShell逻辑为每个循环

$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 } 
} 

回答

0

$server变量的值在传递给远程系统后超出了范围。为了防止这种情况发生,你需要传递你需要的参数。要做到这一点,你把你作为一个功能使用,并为它定义的参数,然后使用Invoke-CommandArgumentList参数脚本块传递值:

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 } 
} 
+0

感谢您提供的所有建议;除此之外,我还需要使用invoke-command在列表中的所有服务器上执行解压缩函数。有没有更好的方法可以做,而不是在每个服务器的invoke-command循环中声明unzip函数? 添加型-AssemblyName System.IO.Compression.FileSystem 功能解压 { 参数([字符串] $压缩文件,[字符串] $ outpath中) [System.IO.Compression.ZipFile] :: ExtractToDirectory($ zipfile,$ outpath) } – workholic

+0

@workholic不,您需要以某种方式在远程会话中声明函数。远程会话与本地会话完全不同。唯一传递给它的是你明确传递给它的东西。 –

1

由于$Server是invoke命令的脚本块内,它不会在该范围存在。您可以通过-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

您的脚本块位于不同的范围内,并且看不到$server。我会建议在执行命令之前弄清楚你的逻辑。

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