首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >powershell for-each循环的逻辑

powershell for-each循环的逻辑
EN

Stack Overflow用户
提问于 2017-08-29 23:55:37
回答 3查看 89关注 0票数 0

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

代码语言:javascript
复制
$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 }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-30 00:06:41

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

代码语言:javascript
复制
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 }
}

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-08-30 00:00:56

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

代码语言:javascript
复制
if ($server -eq 'server1') {
    Invoke-Command -ComputerName $server -Credential $cred -ScriptBlock { 
        "Stuff to do on Server1"
    }
} else { "Other Servers"}
票数 1
EN

Stack Overflow用户

发布于 2017-08-30 00:01:06

你的scriptblock在不同的作用域中,看不到$server。我建议在执行命令之前弄清楚您的逻辑。

代码语言:javascript
复制
If ($Server -eq 'server1')
{ Invoke-Command -ComputerName $Server -Credential $Cred -ScriptBlock {} }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45943517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档