将控制台中显示的确切命令错误输出获取到 Powershell 变量中

Get the exact command error output displayed in console into a Powershell variable

我正在编写一些脚本来备份注册表,但遇到了 2 个小问题。第一个是我无法拦截 reg export 命令的错误输出。

示例:

reg export HKEY_CURRENT_USER\Software\OpenVPN-GUI test.reg

将此写入控制台,因为密钥不可用:

ERROR: The system was unable to find the specified registry key or value.

我很想得到这个精确的字符串。

将命令分配给变量会导致空字符串,即使 Out-String:

$regerror = reg export HKEY_CURRENT_USER\Software\OpenVPN-GUI test.reg | Out-String

我找到的最接近的解决方案是这种重定向:

$regerror = & reg export HKEY_CURRENT_USER\Software\OpenVPN-GUI test.reg 2>&1

但是显示:

reg.exe : ERROR: The system was unable to find the specified registry key or value.
At line:1 char:9
+ $test = & reg export HKEY_CURRENT_USER\Software\OpenVPN-GUI test.reg  ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (ERROR: The syst...y key or value.:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

我想知道是否有一种简单的方法可以在不尝试处理上面的文本的情况下获得所提到的准确输出。

只需将 stderr 行转换为 strings:

$regerror = 
  reg export HKEY_CURRENT_USER\Software\OpenVPN-GUI test.reg 2>&1 | 
    ForEach-Object ToString

虽然 stderr 是以字符串开头,但当您使用 2> 重定向时,PowerShell 将它们包装在 [System.Management.Automation.ErrorRecord] 个实例中,这就是导致它们在打印到显示器时呈现为 PowerShell 错误的原因. (在 PowerShell (Core) 7+ 中,它们不再 呈现 ,但它们仍然包含在 [System.Management.Automation.ErrorRecord] 个实例中。