1

Помещение следующих строк в конец скрипта PowerShell имеет следующие функциональные возможности:

  if($Host.Name -eq "ConsoleHost")
  {
    Write-Host "Press any key to continue..." -NoNewline
    $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyUp") > $null
  }
  1. Если я запустил сценарий, щелкнув правой кнопкой мыши по нему и выбрав "Запустить с PowerShell", окно консоли останется для меня открытым, пока я не нажму любую клавишу для продолжения.
  2. Если у меня уже открыто окно PowerShell и я запускаю скрипт из этого окна, то, хотя текст "Нажмите любую клавишу для продолжения" все еще появляется, мне фактически не нужно ничего нажимать, чтобы продолжить; это делает это самостоятельно. Следовательно, я могу сразу же запустить что-то еще.

Мне нравится это поведение, но я бы предпочел ограничить его определенным подмножеством клавиш (или даже просто одной клавишей, такой как клавиша ввода), если это возможно. Использование read-host не работает, тогда мне все равно придется вводить данные даже при запуске из другого окна PowerShell; цель состоит в том, чтобы просто остановить закрытие окна, когда я запускаю его из контекстного меню. Мне не нужно ничего вводить при запуске с уже существующей консоли PowerShell.

По сути, мне нравится функциональность кода, который у меня есть выше, но я хочу ограничить ключи, к которым он применяется.

Можно ли этого добиться? Если так, то как?

2 ответа2

0

Вот как я получаю Readkey, чтобы ограничить его ввод.

В функции есть массив допустимых символов, которые проверяются кодом с помощью ($ ValidCHARs -match $ Response.Характер) состояние. Если он не совпадает, он будет игнорировать ввод.

Это еще не касается Ctrl, Alt, Shift и тому подобного. Если вам это нужно, прокомментируйте ниже ваше предложение, и я добавлю его в эту функцию.

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

Что касается этого ...

цель состоит в том, чтобы просто остановить закрытие окна, когда я запускаю его из контекстного меню

Из всех мы знаем, что причина этого заключается в том, что контекстное меню просто запускает powershell.exe, а ваш сценарий является аргументом. Итак, он должен закрыться. Вы не можете делать то, что вам нужно из контекстного меню, не изменив способ, которым контекстное меню выполняет вызов к хосту скрипта.

Конечно, вы можете зайти в реестр и взломать его, чтобы изменить это. Однако, чтобы быстро справиться хотя бы с этим закрытым окном, щелкните правой кнопкой мыши на .ps1, без всякого взлома. Попробуй это.

1 - Создайте новый ярлык на рабочем столе и поместите ниже в поле «Цель».

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

2 - Дайте ярлыку имя PowerShell или что-то еще

3 - Скопируйте его в свою папку SendTo: C:\Users\YourUserName\AppData\Roaming\Microsoft\Windows\SendTo

Щелкните правой кнопкой мыши по вашему сценарию и выберите SendTo, затем выберите ярлык.

Конечно, это еще один щелчок, но его очень просто реализовать по сравнению с написанием дополнительных вещей.

Как и панель задач, вы можете фактически поместить все, что вы хотите, в папку SendTo, чтобы иметь дело с типом файла, с которым вы хотели бы работать / с / запустить.

Что касается этого ...

Я бы предпочел ограничить его определенным подмножеством клавиш (или даже просто одной клавишей, такой как клавиша ввода)

Я, честно говоря, не уверен в этом (поскольку вам придется изменить сообщение и сообщить пользователю, какую клавишу нажимать, поскольку вы меняете значение по умолчанию), я уверен, что у вас есть свои причины, но для этого, конечно, потребуется немного больше работы, и мне придется сначала поиграть с ней.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .