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
ソリューションは本当に気に入っていますが、TRY / CATCHの前にTSQLで信頼性の高いストアドプロシージャを書くという悪夢を思い起こさせます。
チュウ

4

参照Get-Help about_Preference_Variables

$ ConfirmPreference
------------------
    Windows PowerShellが自動的にプロンプ​​トを表示するかどうかを決定します
    コマンドレットまたは関数を実行する前の確認。

...

なし:Windows PowerShellは自動的にプロンプ​​トを表示しません。
                         特定のコマンドの確認を要求するには、使用します
                         コマンドレットまたは関数のConfirmパラメーター。

そう:

> $ConfirmPreference = 'None'

私が設定しなければならなかった問題を見るためにそれを見つけました。$ ConfirmPreference = 'Low'
Guy Thomas

これは機能していないようです。ディレクトリのRemove-Itemは、$ ConfirmPreferenceを 'None'または 'Low'に設定した後も引き続きプロンプトを表示します
Chuu

Works for Remove-ADUser(Server 2012R)
velkoon

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

ディレクトリを作成したときに上記のすべてのソリューションが失敗しました。つまり、スクリプトが作成したすべてのディレクトリをすべてOKにするように求められました。私のために働いたのは、結果をOut-NullにパイプするためのOut-null

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

$ Directoryは、作成するディレクトリへのフルパスを含む文字列であることに注意してください。これが誰かの時間を節約することを願っています:P


-1

2つのテクニックをお勧めします

a)追加 -force

b)追加 -errorAction silently continue

これは、どのコマンドレットが特定のパラメーターをサポートするかを調査する方法です

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

この道を始めた理由の1つは、通常-forceの反対、つまり-alwaysbackoffのようなことをしたいということです。しかし、-forceをサポートするほとんどのコマンドには、バックオフするオプションがないようです。
チュウ

1
余談ですが、の便利な略語は-errorAction SilentlyContinueです-ea 0
ジェイバズジ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.