Powershell выдает завершающую ошибку при импорте reg, но операция завершается успешно - PullRequest
0 голосов
/ 28 апреля 2020

И этот стековый пост , и этот выглядел одинаково, но я не смог найти там своего решения. У меня проблема с пониманием различий между поведением в reg reg и import reg.

При запуске reg export в powershell возвращается «операция успешно завершена», но 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 от имени администратора, а вошедший в систему пользователь является локальным администратором на сервере. Любая помощь приветствуется.

1 Ответ

1 голос
/ 28 апреля 2020

Ваша "проблема" в том, что вы используете PowerShell в ISE. Попробуйте использовать PowerShell напрямую. Разница? Сначала две странные вещи:

  1. reg export записывает свой вывод в случае успеха в stdout. reg import записывает свой вывод в случае успеха в stderr (я бы посчитал это "странным").
  2. ISE выдает исключение, если внешняя программа пишет в stderr. PowerShell этого не делает.

В заключение, ISE выдает ошибку в фактическом сообщении об успехе, поскольку оно было записано в stderr. Вы можете предотвратить это, используя командлет Start-Process:

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

, поскольку stdout и stderr внешней программы не передаются на ваш терминал. Вместо этого вы можете обращаться к ним через параметры -RedirectStandardOutput и -RedirectStandardError, если это необходимо.

Если вы хотите оценить код выхода, вы можете сделать это следующим образом:

$process = Start-Process reg -ArgumentList "import C:\Scripts\MyFile.reg" -PassThru -Wait
$process.ExitCode
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...