Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 将cmd错误捕获到当前目录中的文件?_Powershell_Cmd - Fatal编程技术网

Powershell 将cmd错误捕获到当前目录中的文件?

Powershell 将cmd错误捕获到当前目录中的文件?,powershell,cmd,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 .\RestartSer

我有一个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"
    }
}
我正在尝试捕获在PowerShell会话上输出的CMD以及当前目录中的文件中可能出现的任何错误,因此在PowerShell中可能会出现错误。\n但我不知道CMD的当前目录规范是什么。除非是同一件事

本质上,我希望实现类似于我们如何捕获PowerShell异常消息的功能,如下所示:

"$server`t" + $_.Exception.Message.ToString().Split(":")[1].Replace("`n","") |
    Out-File -FilePath .\RestartServers_LOG.txt -Append
但是CMD不处理像PowerShell这样的异常,而是处理STDERR


注意:我之所以使用shutdown.exe命令,是因为PowerShell无法按计划或计划外重新启动。很遗憾。

只需按高级方式执行即可:

$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无论如何也不会做任何事情。

您完全正确,try-catch没有按预期工作,似乎是因为它需要异常我尝试了您的脚本及其完美!但是我怎样才能打印到控制台呢?它只打印到file@Cataster设置Content->Tee object我要用管道传输吗?类似于Set Content->Tee Object | Set Content'.\RestartServers_LOG.txt'否。您可以用另一个cmdlet替换一个cmdlet。有关使用信息,请查看文档。