PowerShell-Limit-Tasten, die vom Pause-Skript akzeptiert werden

Das Setzen der folgenden Zeilen am Ende eines PowerShell-Skripts hat die folgende Funktionalität:

  if($Host.Name -eq "ConsoleHost")
  {
    Write-Host "Press any key to continue..." -NoNewline
    $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyUp") > $null
  }
  1. Wenn ich das Skript ausführe, indem ich mit der rechten Maustaste darauf klicke und zu "Mit PowerShell ausführen" gehe, bleibt das Konsolenfenster für mich geöffnet, bis ich eine beliebige Taste drücke, um fortzufahren.
  2. Wenn ich bereits ein PowerShell-Fenster geöffnet habe und das Skript in diesem Fenster aus starte, muss ich zwar immer noch den Text "Drücken Sie eine beliebige Taste, um fortzufahren" drücken alles, um fortzufahren; es tut dies auf eigene Faust. Daher kann ich danach sofort etwas anderes ausführen.

Ich mag dieses Verhalten, aber ich würde es vorziehen, es auf eine bestimmte Teilmenge von Schlüsseln (oder sogar nur einen einzelnen Schlüssel, wie die Eingabetaste) zu beschränken, wenn möglich. Die Verwendung von read-host funktioniert nicht, dann muss ich immer noch Eingaben eingeben, auch wenn ich von einem anderen PowerShell-Fenster aus ausgeführt werde; Das Ziel ist, das Schließen des Fensters einfach zu stoppen, wenn ich es über das Kontextmenü ausführe. Ich hätte nicht so geben Sie alles ein, wenn Sie von einer bereits vorhandenen PowerShell-Konsole aus ausgeführt werden.

Grundsätzlich mag ich die Funktionalität des Codes, den ich oben habe, aber ich möchte die Schlüssel einschränken, für die er gilt.

Ist es möglich, dies zu erreichen? Wenn ja, wie?

Author: ereHsaWyhsipS, 2018-07-17

2 answers

Wie für diese...

Das Ziel ist, das Schließen des Fensters einfach zu stoppen, wenn ich es über das Kontextmenü

Von uns allen wissen wir, dass der Grund dafür ist, dass das Kontextmenü nur Powershell ausführt.exe und Ihr Skript ist ein Argument. Also sollte es schließen. Sie können das Gewünschte nicht über das Kontextmenü ausführen, ohne die Art und Weise zu ändern, wie das Kontextmenü den Aufruf des Skripthosts ausführt.

Sicher, dass Sie in die Registrierung gehen können und hacke es an, um das zu ändern. Um jedoch schnell mit mindestens diesem schließen Fenster auf der rechten Maustaste auf eine .ps1, ohne reg Hacking. Probier das aus.

1-Erstellen Sie eine neue Desktop-Verknüpfung und platzieren Sie die unten in der Zielbox.

%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -noexit

2-Geben Sie die Verknüpfung Namen PowerShell, oder was auch immer

3-Kopieren Sie es in Ihren SendTo-Ordner: C:\Users\YourUserName\AppData\Roaming\Microsoft\Windows\SendTo

Rechtsklicken Sie auf Ihr Skript und wählen Sie SendTo, dann wählen Sie Ihre Verknüpfung.

Sicher, es ist noch ein Klick, aber sehr einfach zu implementieren vs zusätzliche Sachen zu schreiben.

Wie die Taskleiste können Sie praktisch alles, was Sie möchten, in den Ordner SendTo legen, um mit einem Dateityp umzugehen, an dem Sie arbeiten möchten / mit / ausführen.

Wie für diese...

Ich würde es vorziehen, es auf eine bestimmte Teilmenge von Schlüsseln (oder sogar nur einen einzelnen Schlüssel, wie die Eingabetaste) zu beschränken)

Ich bin mir ehrlich gesagt nicht sicher über den Punkt (wie du es getan hättest um die Nachricht zu ändern und dem Benutzer mitzuteilen, welche Taste gedrückt werden soll (da Sie die Standardeinstellung ändern), haben Sie sicher Ihre Gründe, aber das erfordert natürlich etwas mehr Arbeit und ich müsste zuerst damit spielen.

 0
Author: postanote,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-07-18 07:32:02

So bekomme ich Readkey, um seine Eingabe zu begrenzen.

In der Funktion gibt es ein Array gültiger Zeichen, gegen die der Code mit der ($ValidCHARs-match $Response.Charakter) Bedingung. Wenn es nicht übereinstimmt, wird die Eingabe ignoriert.

Hier geht es noch nicht um Strg, Alt, Shift und dergleichen. Wenn Sie das brauchen, kommentieren Sie unten Ihren Vorschlag und ich füge ihn dieser Funktion hinzu.

Function Keyboard_Input { # KeyMode1 - One keystroke only, No Enter Required (Uses $Host.UI.RawUI.ReadKey)

    [array]$ValidCHARs = @( #Change these entries to allow more characters
    "A"
    "C"
    "D"
    "E"
    "J"
    "L"
    "M"
    "N"
    "P"
    "S"
    "T"
    "V"
    "0"
    )

    Write-Host "You must type one of the following: ";$ValidCHARS -join ","
    Write-Host ""
    Write-Host "Please press a key to make your selection..."

    $Host.UI.RawUI.FlushInputBuffer() #Needed to get a whole new keystroke entry

    DO {[array]$Response = $Host.UI.RawUI.ReadKey("IncludeKeyDown,NoEcho")} UNTIL ($ValidChars -match $Response.Character)

    Write-Host ""
    Start-Sleep -Milliseconds 250
    Write-Host "################################################"
    Write-Host -no "Attributes of Response are: " -F Red;Get-Variable -Name Response | Select *;Start-Sleep -Milliseconds 500
    Write-Host "################################################"
    Write-Host "The Response Record Values are: " -F Red;$Response
    pause
}

Keyboard_Input
pause
 0
Author: Inventologist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-02-18 23:19:28