将cmd错误捕获到CURRENT目录中的文件?

时间:2018-10-24 18:23:53

标签: powershell cmd

我有一个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会话上以及在CURRENT目录中的文件上输出,因此在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无法重新启动“计划中”或“计划外”。

1 个答案:

答案 0 :(得分:1)

只需按照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不会做任何事情。