2016-10-24 95 views
1

Powershellコマンドレットの$?$lastexitcodeの変数と-Confirmのフラグの関係を理解し​​ようとしています。Powershellで-Confirmを使用する

たとえば、あなたが-confirmでコマンドを実行すると言うことは、行動のために応じて入力を促します:

PS C:\temp> rm .\foo.txt -confirm 
Confirm 

Are you sure you want to perform this action? 

Performing the operation "Remove Directory" on target "C:\temp\foo.txt". 
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help 
(default is "Y"):n 

PS C:\temp> $? 

True 

私は技術的にコマンドが正常に実行されたが、ユーザが何を選択した場合、コマンドは実行されませんでしたことを理解しています。

私の質問は、-Confirmフラグに対するユーザーの回答をどのように取得するのですか?

答えて

0

AFAIK、確認プロンプトに対するユーザーの応答を取得することはできません。 PowerShellのコマンド履歴の一部ではなく、他のホストが別のバッファを使用するため、何らかの形でバッファから情報を取得できるかもしれませんが、デフォルトのPowerShellホストでのみサポートされます。この場合は、if文を使用してスクリプト内で個別に確認するのが最善の方法です。

$userAnswer = Read-Host "Are you sure you wish to proceed?" 
if($userAnswer -eq "yes"){ 
    rm .\foo.txt 
}  

次に、$ userAnswer変数を使用して、ユーザーの回答を把握してください。また、操作が完了したかどうかを確認することで、回答を判断することもできます。この方法では、コマンドレットが正常に実行され、ユーザーが確認されたため、ファイルが削除されていることを確実に確認できます(信頼性はおそらく、あなたが何らかの種類のサードパーティのライブラリを使用している場合には、それは違いを生む可能性があります)は、以下のようになります。

rm .\foo.txt -Confirm 

if(Test-Path .\foo.txt){ 
    $success = $false 
} else { 
    $success = $true 
} 

とあなたが本当にそれはあなたが助け

rm .\foo.txt -Confirm 


if(Test-Path .\foo.txt){ 
    $success = $false 
} else { 
    $success = $true 
} 

if(!($success) -and (!($?))){ 
    $status = "Previous command failed" 
} elseif (!($success) -and $?){ 
    $status = "User cancelled operation" 
} 

希望のような何かを行うことができなかったと言っ起因するエラーまたはユーザーに削除に失敗したかどうかを知る必要がある場合。

+0

お返事ありがとうございます。 :) –

2

$?,および-Confirmは、互いに完全に無関係である。

$?は、最後の(PowerShell)操作が正常に実行されたかどうかを示すブール値を持つautomatic variableです。

$LastExitCodeは、最後に実行された外部コマンドの終了コード(整数値)を持つautomatic variableです。

-Confirmは、コマンドレットがユーザーにアクションの確認を求めるかどうかを制御するかどうかを制御します。

私の知るところでは、PowerShellは-Confirmプロンプトに与えられた回答をどこにも保存しないので、何かのためにその応答が必要な場合はprompt the user yourselfとなります。このように:

function Read-Confirmation { 
    Param(
    [Parameter(Mandatory=$false)] 
    [string]$Prompt, 
    [Parameter(Mandatory=$false)] 
    [string]$Message 
) 

    $choices = New-Object Collections.ObjectModel.Collection[Management.Automation.Host.ChoiceDescription] 
    $choices.Add((New-Object Management.Automation.Host.ChoiceDescription -ArgumentList '&Yes')) 
    $choices.Add((New-Object Management.Automation.Host.ChoiceDescription -ArgumentList '&No')) 

    -not [bool]$Host.UI.PromptForChoice($Message, $Prompt, $choices, 1) 
} 

$doRemove = if ($PSBoundParameters['Confirm'].IsPresent) { 
    Read-Confirmation -Prompt 'Really delete' 
} else { 
    $true 
} 

if ($doRemove) { 
    Remove-Item .\foo.txt -Force 
} 
関連する問題