2

这个堆栈帖子这个看起来都很相似,但我在那里找不到我的解决方案。我在理解 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

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

我以管理员身份运行 Powershell,登录用户是服务器上的本地管理员。任何帮助表示赞赏。

4

1 回答 1

2

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

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

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

Start-Process reg -ArgumentList "import C:\Scripts\MyFile.reg"

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

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

$process = Start-Process reg -ArgumentList "import C:\Scripts\MyFile.reg" -PassThru -Wait
$process.ExitCode
于 2020-04-28T16:45:50.713 回答