PowerShell-Eingabeaufforderung, um die Ausführung des Codes fortzusetzen

9

Ich habe ein Skript, mit dem ich WSUS- Prozesse automatisiere , und in der letzten Phase werden alle alten / unnötigen Dateien / Objekte entfernt.

Ich möchte vor der Bereinigungsphase die Eingabetaste drücken, um mit dem Entfernen fortzufahren, oder eine andere Taste zum Beenden drücken, um den Benutzern die Möglichkeit zu geben, sie nicht auszuführen.

Der Code, den ich derzeit am Ende des Skripts habe, ist hier:

Get-WsusServer 10.1.1.25 -PortNumber 8530 | Get-WsusUpdate -Classification All -Approval Unapproved -Status FailedOrNeeded | Approve-WsusUpdate -Action Install -Target $ComputerTarget -Verbose

Write-Host "Updates have been approved!"
Write-Host "Preparing to clean WSUS Server of obsolete computers, updates, and content files."

#Part2 - WSUS Server Cleanup

##Run Cleanup Command
Get-WsusServer $WSUS_Server -PortNumber $PortNumber | Invoke-WsusServerCleanup -CleanupObsoleteComputers -CleanupObsoleteUpdates -CleanupUnneededContentFiles

Kurz vor # Part2 möchte ich die Eingabeaufforderung "Drücken Sie die Eingabetaste, um fortzufahren, oder eine andere Taste zum Abbrechen" erhalten.

Gibt es eine einfache Möglichkeit, dies zu tun?

Alles, was ich gesehen habe, scheint das Verschachteln des gesamten Skripts in einem Codeblock zu beinhalten, was ich lieber nicht tun würde. = /

Abraxas
quelle

Antworten:

9

Eine andere einfache Lösung wäre zu verwenden:

Read-Host -Prompt "Press any key to continue or CTRL+C to quit" 

Ich glaube, dies ist eine bessere Lösung für die derzeit akzeptierte Antwort, da die Anforderung, die Eingabetaste auf der Tastatur zu drücken, erforderlich ist. Ich glaube nicht, dass das Drücken der Eingabetaste die UI-Eingabeaufforderung akzeptiert, es sei denn, dieses UI-Element ist im Fokus.

Christopher
quelle
5

Fügen Sie einfach -confirm zu Ihrem Befehl Invoke-WsusServerCleanup hinzu. Es ist eingebaut.

Robert Overmyer
quelle
1
Ich ... oh ... wow ... äh ... ja. Das ist eine tolle Idee. Das Betrachten von Parametern könnte einen Wert haben? Hoppla!
Abraxas
Ich habe darüber nachgedacht, -confirm in meiner Antwort zu erwähnen, aber Sie waren in Ihrer Frage spezifisch. Wenn Sie nur eine Eingabeaufforderung wünschen, ist dies die beste Antwort.
Jim B
Die ursprüngliche Ursache für die Frage war die Möglichkeit, die Option "Nächsten Schritt genehmigen" zu erfüllen, und ich mag die zusätzlichen Vorteile des Schreibens in eine Variable und der Prüfung der if-Anweisung. Abgesehen davon, wenn ich gerade wieder an dem Skript gearbeitet hätte, hätte ich es nicht gepostet, wenn ich davon gewusst hätte. Vielen Dank für all die tollen Antworten.
Abraxas
3

Siehe Anhalten eines Skripts, bis der Benutzer eine Taste drückt

Die relevanten Skriptzeilen sind:

Write-Host "Press enter to continue and CTRL-C to exit ..."
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

Sie können einen Check für die Eingabe und den Umbruch hinzufügen. Dies ist eine Schleife, wenn Sie wirklich wirklich möchten, dass nur ein Schlüssel fortgesetzt wird. Sie können auch ein anderes hinzufügen, um das Skript zu beenden. Ich würde jedoch empfehlen, den Benutzer nur daran zu erinnern, dass Strg-C beendet wird. Warum Code für etwas, das eingebaut ist?

Jim B.
quelle
Das ist großartig, aber ich würde gerne lernen, wie man einen Check für 'enter' macht oder sogar irgendwann etwas wie 'a für ja an alle' 'y für ja' 'n für nein' 'c für stornieren' Are Gibt es Artikel, in denen Best Practices dafür aufgeführt sind? Ich beschäftige mich gerade mit PowerShell-Skripten und finde unnötig komplexe Optionen.
Abraxas
Es wird eine If-Anweisung für die Variable $ x sein. Es gibt keine "Best Practice" für if-Anweisungen, aber eine Suche nach "Powershell if" kann Ihnen die Syntax geben. Es lohnt sich, einen Versuch zu unternehmen und dann zu posten, wenn das "Wenn" nicht funktioniert.
Jim B
2

Schreiben Sie Pausein jedem Schritt, in dem PowerShell ausgeführt werden soll, Ihren Code ein. PowerShell bleibt bei "Drücken Sie die Eingabetaste, um fortzufahren ...:", bis Sie Enterdie Shell / ISE drücken oder schließen .

Colyn1337
quelle
2

Sie können die Schreibwarnoption verwenden. ziemlich schlank:

Write-Warning "This is only a test warning." -WarningAction Inquire
WARNING: This is only a test warning.
Confirm
Continue with this operation?
 [Y] Yes  [A] Yes to All  [H] Halt Command  [S] Suspend  [?] Help (default is "Y"):
Deepayan Pandharkar
quelle
Prost Kumpel, das ist eine sehr nette Art, es zu tun!
Stuggi
1

Sie können ein Read-HostCmdlet einfügen und den Eingabewert dann wie gewünscht verarbeiten.

$userInput = Read-Host 
Slybloty
quelle
1

Erstellen dieser Antwort nur als Folge-Add-On basierend auf dem Kommentar des OP zur Validierung von Eingaben als Ergänzung zu den anderen guten Antworten. Es war zu lang, um an der richtigen Stelle einen Kommentar abzugeben.

Die Überprüfung der Eingabe kann auf verschiedene Arten erfolgen. Aus persönlichen Gründen verwende ich die switch- Anweisung gerne für die Eingabevalidierung, da ich sie im Allgemeinen leichter zu lesen und zu debuggen finde als eine Reihe von if else s und vielseitiger als eine Weile .

Ebenso bevorzuge ich die Verwendung von Funktionen gegenüber Schleifen, um die Validierung nicht zu bestehen, da ich den Code sauberer und wiederverwendbarer finde. Funktionen haben auch die eingebaute Möglichkeit der Parametervalidierung, bei der dies der beste Weg ist, den Inhalt einer Variablen zu validieren.

Als Beispiel hier eine einfache Funktion, die sich selbst aufruft, um die Frage neu zu formulieren, wenn die Eingabe nicht wie erwartet ist.

function Get-SomeInput {
    $input = read-host "Please write yes or no and press Enter"

    switch ($input) `
    {
        'yes' {
            write-host 'You wrote yes'
        }

        'no' {
            write-host 'You wrote no'
        }

        default {
            write-host 'You may only answer yes or no, please try again.'
            Get-SomeInput
        }
    }
}

Get-SomeInput
ErikE
quelle
Dies in eine Funktion zu verwandeln ist übertrieben. Diese Antwort ist nicht falsch oder schlecht, nur überkompliziert.
Jim B
1
Ich stimme @Jim nicht unbedingt zu, es ist eine wiederverwendbare Methode, Code zu wiederholen = weniger Code. Es geht um Umstände und Vorstellungskraft. Aber vergessen Sie nicht, das OP fragte, wie in einem Kommentar zu validieren ist , ein Fall, in dem die switch-Anweisung herausragend ist.
ErikE
Wir müssen zustimmen, nicht zuzustimmen. Wir entwickeln keine Anwendungen, daher wird eine Funktion, die satte 3 Zeilen des Code oben ersetzt, nicht häufig wiederverwendet. Außerdem wird die Powershell-Entwicklung beim Schreiben eines Modells für die Skripterstellung unterbrochen. Es ist sicherlich nützlich, ein Repository mit Code für Dinge zu haben, die Sie herausfinden mussten, die kompliziert waren - eine if-Anweisung gehört meiner Meinung nach nicht dazu
Jim B
Ja @Jim, ich habe es auf persönliche Vorlieben zurückgeführt. Ich finde beides nicht kompliziert, aber das ist leichter zu lesen - der Wert, der bewertet wird, springt irgendwie in die Augen. Wenn Sie ein if-else verwenden, liegen Sie bei den 3 Zeilen falsch. Es geht darum, eine Schleife zu erstellen, für die Sie auch ein paar Zeilen mehr ausgeben würden (ich habe eine Funktion dafür ausgeführt). Wenn Sie meine bevorzugte Art der Formatierung "Spreizen Ihrer Flügel" verwenden, um den vertikalen Raum für eine bessere Lesbarkeit zu opfern, erhalten Sie auch mehr Zeilen. Der große Vorteil ist, dass ich meinen Programmablauf beim Debuggen auf sehr wenige Zeilen konzentrieren kann, in diesem Fall eine Zeile mit einem Befehl.
ErikE
Wenn Sie Code wiederverwenden möchten, erstellen Sie ein Snippet. Ich denke, es ist eine schlechte Praxis, Skripte mit Profilabhängigkeiten oder noch schlimmer Eimern mit Funktionsdeklarationen zu erstellen. Ich schätze die Offenheit und es gibt mir auch einige Klassenideen.
Jim B