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. = /

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.


5

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


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?


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 .


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"):

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 

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.