首页 > 解决方案 > 使用“重新启动计算机”powershell时如何通过管道传输不同的输出

问题描述

我有一个 csv 文件

SERVERS|SEQUENCE|INDEX
ServerA|  1     | 1.1
ServerB|  1     | 2.1
ServerC|  2     | 3.1

这是我的代码

#importing csv into ps$
$csv = Import-Csv "sequencing.csv"

#Grouping & Sort data from csv
$objdata = $csv | Select SERVERS,SEQUENCE | Group SEQUENCE | Select @{n="SEQUENCE";e={$_.Name}},@{n="SERVERS";e={$_.Group | ForEach{$_.SERVERS}}} | Sort SEQUENCE
foreach ($d in $objdata)
    {
        $order = $d.SEQUENCE
        $cNames = $d.SERVERS

        if (Restart-Computer -ComputerName $cNames -Force -Wait -For Wmi -Delay 1 -ErrorAction SilentlyContinue)
            {
                 write-host "$cNames is rebooting" -ForegroundColor Green
            }
        else
            {
            Write-Host "Unable to reboot $cNames remotely, Please do it manually" -ForegroundColor Red
            }
    }

我正在尝试按顺序重新启动多个服务器,并通过 2 个不同的结果管道输出。从我的代码中,所有服务器都将重新启动,但将通过else语句输出。谁能指出我正确的方向?任何帮助,将不胜感激。

标签: powershellcsv

解决方案


正如Lee_Daily已经指出的那样,Restart-Computer不会返回任何东西。这意味着你将不得不使用一个try/catch块。

为确保在发生错误时您确实输入了 catch 块,您需要将ErrorAction参数设置为Stop.

在您的代码中,您显示了一个要导入的 csv,它具有管道符号|作为分隔符,因此您需要在Import-Csvcmdlet 上指定它。

从您的最新评论中,我了解到您想一次循环一台计算机,而不是一次重新启动多台计算机,这样您就会知道哪台计算机出错了。

尝试:

# importing csv into ps$
$csv = Import-Csv "D:\sequencing.csv" -Delimiter '|'

# Grouping & Sort data from csv
$objdata = $csv | Select-Object SERVERS,SEQUENCE | 
                  Group-Object SEQUENCE | 
                  Select-Object @{Name = "SEQUENCE"; Expression = {$_.Name}},
                                @{Name = "SERVERS"; Expression = {$_.Group.SERVERS}} | 
                  Sort-Object SEQUENCE

$objdata | ForEach-Object {
    foreach ($server in $_.SERVERS) {
        try {
            Restart-Computer -ComputerName $server -Force -Wait -For Wmi -Delay 1 -ErrorAction Stop
            Write-Host "Server $server is rebooting" -ForegroundColor Green
        }
        catch {
            Write-Host "Unable to reboot $server remotely, Please do it manually" -ForegroundColor Red
        }
    }
}

看到您的最新评论,我知道您只想重新启动 CSV 中的 SEQUENCE 值设置为“1”的服务器。正确的?

另外,你想在重启服务器的同时,还希望能够看到哪些服务器没有重启。也许你可以通过运行来做到这一点Restart-Computer -AsJob,但我相信这只适用于 PowerShell 5.1

下面的代码过滤掉所有 SEQUENCE 设置为的服务器,1并一次重新启动它们(如您原来的问题“我正在尝试按顺序重新启动多个服务器”中所要求的):

# import csv data
$csv = Import-Csv "D:\sequencing.csv" -Delimiter '|'  # change this to the delimiter actually used in the CSV !

# get the list of servers where SEQUENCE is set to '1'
$servers = $csv | Select-Object SERVERS,SEQUENCE |
                  Where-Object { $_.SEQUENCE.Trim() -eq '1' } |
                  ForEach-Object { $_.SERVERS.Trim() }

foreach ($server in $servers) {
    try {
        Restart-Computer -ComputerName $server -Force -Wait -For Wmi -Delay 1 -ErrorAction Stop
        Write-Host "Server $server is rebooting" -ForegroundColor Green
    }
    catch {
        Write-Host "Unable to reboot $server remotely, Please do it manually" -ForegroundColor Red
    }
}

推荐阅读