我有一个 PowerShell 脚本,可以重新启动文件中列出的服务器。
foreach ($server in $servers) {
try {
cmd /c "shutdown.exe /r /f /m \\$server /t 0 /d p:0:0 /c 'PlannedRestart'"
"$server`tRestarted"
"$server`tRestarted" | Out-File -FilePath .\RestartServers_LOG.txt -Append
} catch {
"$server`t" + cmd /c ">&1"
"$server`t" + cmd /c "dir > .\RestartServers_LOG.txt 2>&1"
}
}
我试图捕获 CMD 可能发生的任何错误,以输出到 PowerShell 会话以及当前目录中的文件,因此在 PowerShell 中,这将是.\
但我不知道CMD当前的目录规范是什么。除非是同一个东西?
本质上,我希望完成类似于我们如何捕获 PowerShell 的异常消息的事情,如下所示:
"$server`t" + $_.Exception.Message.ToString().Split(":")[1].Replace("`n","") |
Out-File -FilePath .\RestartServers_LOG.txt -Append
但 CMD 并不像 PowerShell 那样处理异常,而是处理 STDERR。
注意:我使用的是命令shutdown.exe
因为不幸的是,PowerShell 无法“计划”或“计划外”重新启动。
就用 PoSh 的方式来做吧:
$params = '/r', '/f',
'/t', '0',
'/d', 'p:0:0',
'/c', 'PlannedRestart'
$servers | ForEach-Object {
$output = & shutdown.exe /m "\\${_}" @params 2>&1
if ($LastExitCode -eq 0) {
"{0}`tRestarted" -f $_
} else {
"{0}`tRestart failed:`t{1}" -f $_, $output
}
} | Set-Content '.\RestartServers_LOG.txt'
外部命令首先不会抛出异常,所以你的try..catch
反正什么也不会做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)