每个回路的powershell逻辑

每个回路的powershell逻辑,powershell,Powershell,我使用下面的powershell脚本循环列表中的服务器,根据服务器的主机名执行特定任务。在下面的脚本中,如果$server='server1',我想执行与其他服务器不同的任务集,但是这个循环直接执行'else'循环。我想我遗漏了什么 $servernames = @("server1", "server2", "server3") $user = '**********' $Password = '*******' $SecurePassword = $Password | ConvertTo-

我使用下面的powershell脚本循环列表中的服务器,根据服务器的主机名执行特定任务。在下面的脚本中,如果$server='server1',我想执行与其他服务器不同的任务集,但是这个循环直接执行'else'循环。我想我遗漏了什么

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

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

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

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

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

您的脚本块位于不同的作用域中,并且没有看到
$server
。我建议在执行命令之前先弄清楚你的逻辑

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

您的脚本块位于不同的作用域中,并且没有看到
$server
。我建议在执行命令之前先弄清楚你的逻辑

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

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

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

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

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

谢谢你的建议;除此之外,我还有一个解压功能,需要使用invoke命令在列表中的所有服务器上执行。除了在每个服务器的invoke命令循环中声明解压函数,还有更好的方法吗?添加类型-AssemblyName System.IO.Compression.FileSystem函数解压{param([string]$zipfile,[string]$outpath)[System.IO.Compression.zipfile]::ExtractToDirectory($zipfile,$outpath)}@workholic否,您需要以某种方式在远程会话中声明该函数。远程会话与本地会话完全不同。唯一能传递给它的是你明确传递给它的东西;除此之外,我还有一个解压功能,需要使用invoke命令在列表中的所有服务器上执行。除了在每个服务器的invoke命令循环中声明解压函数,还有更好的方法吗?添加类型-AssemblyName System.IO.Compression.FileSystem函数解压{param([string]$zipfile,[string]$outpath)[System.IO.Compression.zipfile]::ExtractToDirectory($zipfile,$outpath)}@workholic否,您需要以某种方式在远程会话中声明该函数。远程会话与本地会话完全不同。唯一传递给它的是你明确传递给它的东西。