Greifen Sie auf die Benutzerauswahl von einem vorherigen Cmdlet zu

277
Iszi

Ich schreibe ein Skript, das ich abhängig von der Antwort des Benutzers auf eine Bestätigungsaufforderung, die Teil eines im Skript ausgeführten Cmdlets ist, reagieren kann. Zum Beispiel:

Stop-Process -Name notepad -Confirm if ($userresposne -eq "Yes") else  

Ich muss wissen, was ich verwenden sollte, um $userresponsedie Benutzereingaben zur Bestätigungsaufforderung in aufzurufen Stop-Process. (Sobald dies bekannt ist, bin ich sicher, dass ich herausfinden kann, was richtig verwendet werden sollte "Yes".) Gibt es eine Möglichkeit, dies zu tun?

Ich arbeite in PowerShell 3.0, aber ich brauche das Skript, um abwärtskompatibel zu 2.0 zu sein.

Der Schlüssel hier ist, dass ich nicht meinen eigenen Aufforderungsmechanismus in das Skript schreiben muss. Mir ist bewusst, dass es Möglichkeiten gibt, dies zu tun, und ich habe es in anderen Skripten gemacht. Da Stop-Processes jedoch bereits in der Lage ist, den Benutzer nach der Eingabe zu fragen, die ich benötige, würde das Hinzufügen dieser zusätzlichen Zeilen hier etwas überflüssig erscheinen.

Beim Batch-Scripting würde ich wahrscheinlich nach einer %ERRORLEVEL%Umgebungsvariablen suchen . Gibt es etwas Ähnliches, das ich hier verwenden könnte?

2

2 Antworten auf die Frage

2
Rоry McCune

Das Cmdlet stop-process unterstützt eine Option -passthru, die in diesem Fall hilfreich sein kann

so könnte man es zuordnen

$ processresult = Stop-Process -Name-Notizblock -Confirm -Passthru

if ($ processresult.name -eq "notepad") else

Wenn der Benutzer den Prozess anhalten möchte (dh Y eintippt), ist $ processresult ein Process-Objekt. Wenn der Benutzer den Prozess nicht beenden möchte (dh n eingibt), ist dies nicht der Fall. Testen Sie das resultierende Objekt und stützen Sie es darauf.

Ein bisschen hacky sollte aber funktionieren.

Alternative Bedingung für das if: `$ processresult -ne $ null`. Dies funktioniert für meinen speziellen Anwendungsfall. Möglicherweise möchten Sie auch $ ErrorActionPreference = 'SilentlyContinue'` vorübergehend festlegen, um zu verhindern, dass PowerShell den Benutzer bei der Auswahl von "Nein" blockiert. Es wäre trotzdem toll, wenn es eine Methode gibt, die für den allgemeineren Fall geeignet ist oder wenn jemand feststellen kann, dass es keine gibt. Iszi vor 10 Jahren 1
Kratzen Sie das bisschen über "$ ErrorActionPreference". Das gilt für einen anderen Teil des Skripts, das ich schreibe. $ Notepad = Get-Process-Notizblock; while ($ Notepad -ne $ null) {$ Notepad = Get-Process-Notizblock}; echo 'Notepad ist endlich tot!' `meldet einen Fehler, wenn Notepad endgültig tot ist, es sei denn, Sie ändern $ ErrorActionPreference`. Iszi vor 10 Jahren 0
Interessanterweise können Sie ganz auf die Variable $ processresult verzichten. `if ((Stop-Process -Name Notizblock -Confirm -Passthru) -ne $ null) else ` Iszi vor 10 Jahren 0
1
David Freitag

Das Schreiben eines zusätzlichen Bits Code für die Eingabebearbeitung ist keine große Sache. Zum Beispiel,

$input = Read-Host "Would you like to kill notepad?"  if($input.ToLower() -eq "yes") { Stop-Process -Name notepad Write-Host "R.I.P. Notepad" } else { Write-Host "Notepad lives to fight another day" } 

Es würde gut funktionieren und würde Ihrem Skript keinen Ton hinzufügen.

Die Funktionalität von `Stop-Process -Name notepad -Confirm` ist immer noch redundant. Ich hätte lieber eine Bestätigung, dass ich * nicht * auf die Benutzereingabe für "Stop-Process" zugreifen kann, bevor ich meine eigene Bestätigungsaufforderung schreibe. (Auch für diesen speziellen Anwendungsfall bevorzuge ich persönlich die Problemumgehung von @ RoryMcCune.) Iszi vor 10 Jahren 0
@Iszi Ich schätze, wenn Sie die Eingabe buchstäblich nur für die Bestätigung des `Stop-Process 'verwenden, dann ist @ RoryMcCunes Antwort ein bisschen glatter. Auch wenn es ein bisschen hackender Hack ist. Mit der Eingabebehandlung können Sie einen Grund für das Töten des Notizblocks oder sogar den Prozess zum Abbruch angeben. David Freitag vor 10 Jahren 0
Für meinen speziellen Fall brauche ich nicht, dass der Benutzer einen Grund oder den Prozess angibt. Ich habe eine bestimmte Anwendung, die nicht für mehrere Benutzer geeignet ist. Wenn also bereits jemand am Server angemeldet ist und die Anwendung in ihrer Sitzung ausgeführt wird, kann ich sie nicht auf meiner ausführen. Ich versuche, die Aufgabe zu automatisieren, zu ermitteln, wer die Anwendung ausführt, und (optional) ihre Instanz zu beenden. Wenn ich mich für die Beendigung entschieden habe, möchte ich, dass das Skript die Anwendung danach ausführt. Wenn ich nicht beenden möchte, sollte das Skript beendet werden. Iszi vor 10 Jahren 0