【问题标题】:Powershell throws terminating error on reg import but operation completes successfullyPowershell 在 reg 导入时抛出终止错误,但操作成功完成
【发布时间】:2020-04-28 15:00:02
【问题描述】:

this stack postthis one 看起来都很相似,但我在那里找不到我的解决方案。我在理解 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's documentation of the reg import command 表示返回码是 0 表示成功,1 表示失败。为什么 Powershell 会将成功作为 reg 导出的常规成功消息返回,但将其作为 reg 导入的终止错误抛出?

我以管理员身份运行 Powershell,登录用户是服务器上的本地管理员。感谢您提供任何帮助。

【问题讨论】:

  • $out = .{ reg import "\\$CurServer\MySharedPath\RegistryBackup.reg" } 2>$null
  • 这会忽略任何错误,因此当我故意指定文件名的错误路径时,它不会引发任何错误。
  • 你不能在 regedit 调用之后测试$LASTEXITCODE,然后抛出你自己的异常。
  • 我更新了文章以删除 Invoke-Command 问题,只关注 reg export 和 reg import 之间的区别。 $LASTEXITCODE 返回 0,如果我们查看有关 reg 导入的 Microsoft 文章,这似乎是正确的。问题是为什么 reg export 将其作为常规消息返回,而 reg import 将其作为终止错误抛出。
  • 哦,你的意思是我使用 $LASTEXITCODE 来创建我自己的异常,其中 if 0 then this if 1 then that,对不起,我没有完全阅读你的声明!是的,我认为这是一种解决方案 :) 虽然它看起来不太好,但我在 catch 中解决问题只是因为它总是抛出错误而做一个 try/catch。

标签: powershell registry remote-registry


【解决方案1】:

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

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

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

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

【讨论】:

  • 这似乎可以解决问题,但我有一个后续问题。当我在 Powershell 中本地运行 reg import 时,它仅正确返回“操作成功”而没有错误。当我使用 Invoke-Command 将该查询发送到远程服务器时,Powershell 仍将其作为错误返回。你知道为什么吗?
  • 我不知道。可能与 ISE 这样做的原因相同(我也不知道)。 Start-Process 应该可以工作,即使通过Invoke-Command
  • 是的,我将使用它,非常感谢您的帮助,这解释了发生了什么:)
  • 以防注册表文件路径中有空格,将其转义为有意义(将 BACKTICK 替换为实际的反引号字符): $process = Start-Process reg -ArgumentList "import BACKTICK "C:\My Scripts\My File.regBACKTICK"" -PassThru -Wait
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 2011-01-22
  • 2010-11-26
  • 2021-11-03
  • 2022-11-16
  • 1970-01-01
  • 2021-10-16
相关资源
最近更新 更多