Чи є спосіб придушити будь-які інтерактивні підказки в сценарії PowerShell?


13

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

Чи є який-небудь спосіб змусити PowerShell автоматично вийти з ладу на відміну від пошуку запиту користувачів на дії?


Я думаю, ви повинні перейменувати своє запитання "Як я можу Remove-Itemшвидко провалитися?"
Джей Базузі

1
Мова йде не тільки про Remove-Item, це лише наочний приклад. Існує безліч інших командлетів, які блокують очікування введення користувачем за правильних умов.
Чуу

Відповіді:


5

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

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

2
Мені дуже подобається рішення, але воно повертає кошмари написання надійних збережених процедур у TSQL перед TRY / CATCH, що вимагало оточувати буквально кожен запит із котловою для виявлення помилок.
Чуу

4

Дивіться Get-Help about_Preference_Variables:

$ ConfirmPreference
------------------
    Визначає, чи автоматично Windows PowerShell запрошує вас
    підтвердження перед запуском командлета або функції.

...

Ні: Windows PowerShell не запитує автоматично.
                         Щоб подати запит на підтвердження певної команди, використовуйте
                         підтвердження параметра командлета або функції.

Так:

> $ConfirmPreference = 'None'

Я виявив, що щоб побачити проблему, яку мені довелося встановити. $ ConfirmPreference = 'Низький'
Гай Томас

Це, здається, не працює. Remove-Item у каталозі все ще надає підказку після встановлення $ ConfirmPreference на "None" або "Low"
Chuu

Працює для Remove-ADUser(Server 2012R)
велькон

2

Гаразд, це справді некрасиво, але свята гірчиця плями "працює".

Проблеми:

  • Я не придумав, як далі після першої помилки
  • У цьому випадку він видаляє звичайні файли, а потім зупиняється на першій папці
  • Я не зрозумів, як змусити цей командлет працювати, якщо я додаю параметр 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"}

Однією з причин, по якій я почав цей шлях, є те, що я, як правило, хочу робити протилежне -сили, тобто щось на кшталт -завжди. Я виявив, що більшість команд, які підтримують -for, здається, не мають можливості відмовитися.
Чуу

1
Як сторону, зручною абревіатурою -errorAction SilentlyContinueє -ea 0.
Джей Базузі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.