【问题标题】:How can I force powershell to output all errors normally in cmd?如何强制powershell在cmd中正常输出所有错误?
【发布时间】:2018-07-25 03:26:07
【问题描述】:

我希望能够使用 Sysnative cmd 执行 powershell 脚本并将结果输出到日志。

当我运行(System32)时:

C:\Windows\System32\cmd.exe /C "powershell -file “C:\…\ScriptWithErrors.ps1" >> C:\…\Log.log”

我的日志将显示 powershell 文件中的错误(通常在终端中显示为红色)

但是当我运行(Sysnative)时:

C:\Windows\Sysnative\cmd.exe /C "powershell -file “C:\…\ScriptWithErrors.ps1" >> C:\…\Log.log”

我的日志不会显示我没有明确使用 Write-Host $_.Exception 的 powershell 脚本中的任何错误。

有没有办法执行powershell脚本并强制输出错误输出?

另外,为什么使用cmd \C 会使 echo 无法正常工作?

>> C:\Windows\Sysnative\cmd.exe /C "echo time \t”
>> time /t (Output)
>> 11:20 AM (Expected output)

【问题讨论】:

  • 为什么要使用不匹配的智能引号和双引号?为什么要将 powershell 命令输出发送到文件而不是 cmd.exe 输出?
  • 匹配智能引号和双引号的示例是什么?而且因为我想将输出保存在日志中。
  • @Compo 另外,将 cmd.exe 的输出重定向到日志也不起作用。
  • 不应该有任何智能引号,再看看你的代码,它们同时使用了 "。您也可以在 .ps1 文件名周围使用单引号:…\cmd.exe /C "powershell -file 'C:\…\ScriptWithErrors.ps1'">>"C:\…\Log.log"
  • 您是否尝试过直接启动 powershell 而不是通过命令提示符代理它? C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe%SystemRoot%\syswow64\WindowsPowerShell\v1.0\powershell.exesysnative 在您的情况下。

标签: powershell batch-file cmd


【解决方案1】:

Powershell 会将会话的所有错误保存在 $Error 变量中。 最新的错误将是数组中的 0 号。

所以基本上要获取会话的所有错误,您最终可以将整个 $Error 变量数组导出到您的日志,或者通过它进行遍历并获取您感兴趣的部分。

要获取错误的行号,您可以在错误变量上使用属性 ScriptStackTrace。

例如我运行:

Get-ChildItem -Path c:\cmder
Get-ChildItem -Path c:\nodirhere

第一行给了我输出,第二行是一个错误。 现在通过选择数组中的位置 0 并询问我得到的 scriptstacktrace 来检查 $Error 数组中的最新错误:

$Error[0].ScriptStackTrace
at <ScriptBlock>, <No file>: line 2

【讨论】:

  • 错误变量上有一个名为 ScriptStackTrace 的属性。我会用一些信息更新答案。
  • 在此处查看脚本以解决错误记录对象并记录您感兴趣的详细信息:stackoverflow.com/questions/795751/…
猜你喜欢
  • 2012-08-11
  • 2015-10-05
  • 2011-10-03
  • 1970-01-01
  • 2012-03-08
  • 2016-05-03
  • 1970-01-01
  • 2019-10-09
相关资源
最近更新 更多