2016-10-24 3 views
1

Ich versuche zu verstehen, wie die Beziehung zwischen $? und $lastexitcode Variablen im Vergleich zu -Confirm Flag in PowerShell-Cmdlets ist.Verwenden von -Confirm in Powershell

Sagen Sie zum Beispiel führen Sie einen Befehl mit -confirm es wird Sie auffordern, entsprechend Handlungsbedarf:

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 

Ich verstehe, dass technisch der Befehl erfolgreich ausgeführt wurde, aber wenn der Benutzer nicht wählte dann der Befehl ausgeführt wird, nicht.

Meine Frage ist, wie bekomme ich die Antwort des Benutzers auf die -Confirm Flagge?

Antwort

0

AFAIK, es ist nicht möglich, die Antwort des Benutzers auf die Bestätigungsaufforderung zu erfassen; Es ist kein Teil des Befehlsverlaufs von PowerShell, und obwohl Sie möglicherweise die Informationen aus dem Puffer abrufen können, die nur vom standardmäßigen PowerShell-Host unterstützt werden, da andere Hosts andere Puffer verwenden. In diesem Fall ist es wahrscheinlich am besten, entweder eine separate Bestätigung in Ihrem Skript mit einer if-Anweisung durchzuführen.

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

Verwenden Sie dann einfach die Variable $ userAnswer, um zu wissen, auf was Ihr Benutzer geantwortet hat. Alternativ könnten Sie ihre Antwort ermitteln, indem Sie überprüfen, ob der Vorgang abgeschlossen wurde. Dies wäre meine bevorzugte Methode, da Sie sicher sind, dass die Datei gelöscht wurde, anstatt dies anzunehmen, weil das Cmdlet erfolgreich ausgeführt und der Benutzer bestätigt hat (die Zuverlässigkeit ist wahrscheinlich nicht anders, wenn man bedenkt, dass remove-item unglaublich gut getestet wurde) Es könnte einen Unterschied machen, wenn Sie eine Drittanbieter-Bibliothek einer Art verwenden, die in etwa so aussehen würde wie unten.

rm .\foo.txt -Confirm 

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

und wenn Sie wirklich wissen müssen, ob es aufgrund eines Fehlers oder den Benutzer löschen fehlgeschlagen nein sagen Sie so etwas wie

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" 
} 

Hoffnung machen könnte, das hilft.

+0

Danke für die schnelle Antwort und die Arbeit um. :) –

2

$?, $LastExitCode und -Confirm sind völlig unabhängig voneinander.

$? ist ein automatic variable mit einem booleschen Wert, der angibt, ob die letzte (PowerShell) -Operation erfolgreich ausgeführt wurde oder nicht.

$LastExitCode ist ein automatic variable mit dem Exit-Code des zuletzt ausgeführten externen Befehls (ein Integer-Wert).

-Confirm ist ein common parameter, der steuert, ob ein Cmdlet den Benutzer zur Bestätigung seiner Aktion auffordert.

PowerShell speichert die Antwort auf eine -Confirm Eingabeaufforderung nirgendwo, also wenn Sie diese Antwort für etwas anderes benötigen, müssen Sie prompt the user yourself, z. wie folgt:

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 
} 
Verwandte Themen