11

При написании сценариев PowerShell я заметил, что когда некоторые командлеты сталкиваются с проблемами, они вызывают интерактивное приглашение, например, Remove-Item в непустом каталоге. Это смертельно опасно, когда я пытаюсь автоматизировать задачи. Я бы предпочел, чтобы действие просто завершилось неудачей, и либо выбрасывал исключение, либо возвращал неверный код возврата, чтобы весь сценарий не был заблокирован в ожидании ответа.

Есть ли способ заставить PowerShell автоматически завершиться с ошибкой, в отличие от поиска пользовательского ввода в действиях?

5 ответов5

4

Решение, предложенное Eris, эффективно запускает другой экземпляр PowerShell. Альтернативный способ сделать это с более простым синтаксисом - это выполнить оболочку для другого экземпляра powershell.exe.

powershell.exe -NonInteractive -Command "Remove-Item 'D:\Temp\t'"
3

Смотрите Get-Help about_Preference_Variables:

$ConfirmPreference
------------------
    Determines whether Windows PowerShell automatically prompts you for
    confirmation before running a cmdlet or function.

...

None:    Windows PowerShell does not prompt automatically.
                         To request confirmation of a particular command, use
                         the Confirm parameter of the cmdlet or function.

Так:

> $ConfirmPreference = 'None'
1

Хорошо, это действительно некрасиво, но святые пятна горчицы это "работает".

Вопросы:

  • Я не разобрался, как продолжить после первой ошибки
  • В этом случае он удаляет простые файлы, затем останавливается на первой папке
  • Я не понял, как заставить этот командлет работать, если я добавлю параметр UseTransaction
  • Это будет работать только для простого случая (команды, которые мало что делают с текущей средой). Я не проверял ничего сложного

    $MyPS = [Powershell]::Create()
    $MyPS.Commands.AddCommand("Remove-Item")
    $MyPS.Commands.AddParameter("Path", "D:\Temp\t")
    $MyPS.Invoke()

Выход:

Commands                                                                                                                 
--------                                                                                                                 
{Remove-Item}                                                                                                            
{Remove-Item}                                                                                                            
Exception calling "Invoke" with "0" argument(s): "A command that prompts the user failed because the host program or the 
command type does not support user interaction. The host was attempting to request confirmation with the following 
message: The item at D:\Temp\t has children and the Recurse parameter was not specified. If you continue, all children 
will be removed with the item. Are you sure you want to continue?"
At line:19 char:1
+ $MyPS.Invoke()
+ ~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : CmdletInvocationException
0

Все вышеперечисленные решения не дали мне результата, когда я создавал каталог, а это означало, что мне было предложено оканчивать все директории, которые создавал мой скрипт, что было много. То, что работало для меня, было приложено | Out-null для передачи результатов в Out-Null

New-Item -ItemType Directory -Path $directory -Force:$true | Out-Null

Обратите внимание, что $ Directory - это строка с полным путем к каталогу, который вы хотите создать. Надеюсь, это сэкономит кому-то время:P

-1

Я предлагаю две техники

а) Добавить -force

б) добавить -errorAction silently continue

Вот как я исследую, какие командлеты поддерживают определенный параметр

Get-Command | where { $_.parameters.keys -contains "erroraction"}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .