Powershell 在 reg 导入时抛出终止错误,但操作成功完成

Mag*_*ism 2 registry powershell remote-registry

这篇堆栈文章这篇文章看起来都很相似,但我在那里找不到我的解决方案。我在理解 reg 导出与 reg 导入行为之间的差异时遇到问题。

在 powershell 内运行 reg export 时,它返回“操作成功完成”,但 reg import 会抛出一个终止错误,提示“操作成功完成”。即使抛出错误,注册表文件也会正确导入。一个例子:

PS C:\Windows\System32> reg export HKLM\Software\MySoftware C:\Scripts\MyFile.reg
The operation completed successfully.

PS C:\Windows\System32> reg import C:\Scripts\MyFile.reg
reg : The operation completed successfully.
At line:1 char:1
+ reg import C:\Scripts\MyFile.reg
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (The operation completed successfully.:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError
Run Code Online (Sandbox Code Playgroud)

Microsoft 的 reg import 命令文档指出,返回码为 0 表示成功,1 表示失败。为什么 Powershell 将成功作为 reg 导出的常规成功消息返回,但将其作为 reg 导入的终止错误抛出?

我以管理员身份运行 Powershell,登录用户是服务器上的本地管理员。如有任何帮助,我们将不胜感激。

sta*_*tor 5

您的“问题”是,您正在 ISE 中使用 PowerShell。尝试直接使用 PowerShell。区别?首先有两件奇怪的事情:

  1. reg export将成功时的输出写入stdout. reg import将成功时的输出写入stderr(我认为这是“奇怪的”)。
  2. 如果外部程序写入 .ISE,则 ISE 会引发异常stderr。PowerShell 不会这样做。

总之,ISE 在实际成功消息上抛出错误,因为它已写入stderr. 您可以使用Start-Processcmdlet 来防止这种情况发生:

Start-Process reg -ArgumentList "import C:\Scripts\MyFile.reg"
Run Code Online (Sandbox Code Playgroud)

因为stdout外部stderr程序不会转发到您的终端。相反,如果需要,您可以通过参数-RedirectStandardOutput和来访问它们-RedirectStandardError

如果你想评估退出代码,你可以这样做:

$process = Start-Process reg -ArgumentList "import C:\Scripts\MyFile.reg" -PassThru -Wait
$process.ExitCode
Run Code Online (Sandbox Code Playgroud)

  • 为了防止注册表文件路径中存在空格,可以将其转义(将 BACKTICK 替换为实际的反引号字符): $process = Start-Process reg -ArgumentList "import BACKTICK"C:\My Scripts\My File.regBACKTICK"" -PassThru -等待 (4认同)