powershell - 使用“重新启动计算机”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语句输出。谁能指出我正确的方向?任何帮助,将不胜感激。
解决方案
正如Lee_Daily已经指出的那样,Restart-Computer
不会返回任何东西。这意味着你将不得不使用一个try/catch
块。
为确保在发生错误时您确实输入了 catch 块,您需要将ErrorAction
参数设置为Stop
.
在您的代码中,您显示了一个要导入的 csv,它具有管道符号|
作为分隔符,因此您需要在Import-Csv
cmdlet 上指定它。
从您的最新评论中,我了解到您想一次循环一台计算机,而不是一次重新启动多台计算机,这样您就会知道哪台计算机出错了。
尝试:
# 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
}
}
推荐阅读
- javascript - 在 setter 中使用带有类型保护的 getter 和 setter
- c# - 并行while循环
- vue.js - Vue i18n - 使用 routerview 将语言环境添加到 URL
- c# - C# UWP WriteableBitmap 到 MediaClip 的转换
- generics - 如何在 Kotlin 中将多个上限语法与委托语法结合起来
- qlikview - 计数功能 Qlikview
- angular - 打字稿:如何访问 navigator.connection 属性
- datepicker - mat datepicker angular6中的周选择
- functional-programming - 这段代码有错误吗?
- qt - QML通过文本更改矩形的颜色