PowerShell,告诉脚本将所有错误输出到文本文件

vbopmzt1  于 2022-11-10  发布在  Shell
关注(0)|答案(1)|浏览(137)

我有一个PowerShell脚本,它是Windows Sandbox的启动脚本,因此它以静默方式运行。
是否可以在PowerShell脚本中放置某种声明,比如在脚本的开头,告诉静默运行的脚本将其所有错误输出到一个文本文件中?
编辑(Fitzgery的评论):我不可能对脚本使用重定向,因为它是作为Windows沙盒启动的一部分静默运行的。我希望在脚本本身中有一些东西来指示运行的脚本将所有错误输出到文本文件中。

bwleehnv

bwleehnv1#

尝试执行以下操作,因为会话中发生的所有错误都会记录在自动$Error变量中:

$Error.Clear() # Reset the session's error log so far

try {

  # ... your script

} finally {
  # Save all errors that occurred in this script to a file.
  $Error > errors.txt
}

注意事项

  • 使用try语句有副作用
  • 您的脚本可能会过早终止,因为任何通常只有语句-终止错误成为脚本-终止错误,因此立即触发finally子句;也就是说,语句-终止错误并不常见**,当它们发生时(意外地)中止执行是有争议的。
  • 如果您要省略try语句并简单地将$Error > errors.txt放在脚本的末尾,(非终止AND)语句-终止错误将照常处理,但如果发生SCRIPT-终止错误,$Error > errors.txt语句将永远不会执行。

使用trap替代解决方案无副作用只有在您知道您的脚本不会产生脚本*-终止错误的情况下:

脚本-终止错误是显式使用throw创建的错误,或者隐式*通过-ErrorAction Stop$ErrorActionPreference = 'Stop'创建的错误

  • (很少再使用)trap语句允许您在不停止执行的情况下对错误执行操作,即如果您在您传递给它的脚本块中使用break

因此,尽管它在非终止语句-终止错误之后继续,就像在正常执行期间一样,但它也在脚本-终止错误之后继续。

  • 因此,副作用-如果您的脚本确实创建脚本-终止错误,它可能不会在您期望的时候停止您的脚本

# Create or truncate the target file.

$errLogFile = New-Item errors.txt -Force

# Traps all errors and logs them in the target ffile.

# Note:

# * Using neither `break` or `continue` in the script block

# still also prints the error and continues execution.

# * CAVEAT: Even *script*-terminating errors then

# do NOT abort execution.

trap { $_ >> $errLogFile }

# ... your script

使用Start-Transcript

  • Start-Transcript是一种捕获所有脚本输出的方式,而不仅仅是*错误(即记录来自PowerShell的所有output streams的输出,特别包括成功输出(数据)-您别无选择*)。
  • 必须与Stop-Transcript配对才能关闭成绩单文件。
  • 如果您忘记调用Stop-Transcript,则脚本将保持打开状态,并在剩余的会话中继续记录
  • 为了确保Stop-Transcript被称为**,您面临着与上面相同的权衡
  • try语句的finally块中调用它可能会过早中止执行。
  • 使用不带breaktrap语句可能不会在应该停止执行时停止执行。
  • 也就是说,如果您的脚本的执行是您的会话中唯一发生的事情**-例如在使用-File的CLI调用中-调用Stop-Transcript将不是问题**,并确保无副作用的日志记录-尽管如上所述,它总是包括所有脚本的输出。

相关问题