PowerShellスクリプトを記述するとき、特定のコマンドレットで問題が発生すると、インタラクティブプロンプトが表示されることに気付きました。空でないディレクトリのRemove-Itemが例です。タスクを自動化しようとするとこれは致命的です。むしろ、アクション全体が失敗し、例外をスローするか、不正なリターンコードを返して、スクリプト全体が応答を待機しないようにします。
アクションでユーザー入力を求めるのではなく、PowerShellを自動的に失敗させる方法はありますか?
PowerShellスクリプトを記述するとき、特定のコマンドレットで問題が発生すると、インタラクティブプロンプトが表示されることに気付きました。空でないディレクトリのRemove-Itemが例です。タスクを自動化しようとするとこれは致命的です。むしろ、アクション全体が失敗し、例外をスローするか、不正なリターンコードを返して、スクリプト全体が応答を待機しないようにします。
アクションでユーザー入力を求めるのではなく、PowerShellを自動的に失敗させる方法はありますか?
回答:
参照Get-Help about_Preference_Variables
:
$ ConfirmPreference ------------------ Windows PowerShellが自動的にプロンプトを表示するかどうかを決定します コマンドレットまたは関数を実行する前の確認。 ... なし:Windows PowerShellは自動的にプロンプトを表示しません。 特定のコマンドの確認を要求するには、使用します コマンドレットまたは関数のConfirmパラメーター。
そう:
> $ConfirmPreference = 'None'
Remove-ADUser
(Server 2012R)
わかりました、これは本当にいですが、聖なるマスタードはそれを「機能します」。
問題点:
これは、単純な場合(現在の環境で多くのことを行わないコマンド)でのみ機能します。複雑なものはテストしていません
$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
2つのテクニックをお勧めします
a)追加 -force
b)追加 -errorAction silently continue
これは、どのコマンドレットが特定のパラメーターをサポートするかを調査する方法です
Get-Command | where { $_.parameters.keys -contains "erroraction"}
-errorAction SilentlyContinue
です-ea 0
。
Remove-Item
早く失敗させることができますか?」