По умолчанию открытие (двойной щелчок) *.ps1
файлов в проводнике файлов / на рабочем столе открывает их для редактирования , а не запускает их, что включает ярлыки файлов этой точки до *.ps1
файлов.
Как вы заявляете, вы используете (предварительно установленную) Run in PowerShell
команду контекстного меню для явного запуска ваших сценариев.
Эта команда вызывает PowerShell без -NoExit
, что означает, что PowerShell открывает новое окно консоли, выполняет файл сценария и затем выходит из сеанса, тем самым автоматически закрытие окна - то есть вы не увидите вывод скрипта после его выхода.
У вас есть три основных варианта:
(a) Чтобы решить проблему для всех сценариев (и файлов ярлыков, указывающих на них), переопределите пользовательскую команду, чтобы оставить сеанс PowerShell открытым с -NoExit
, что означает, что окно всегда остается открытым после завершения выполнения скрипта - см. ниже.
(b) Для заданного сценария (и файла ярлыка, указывающего на него) измените его так, чтобы в конце команда Read-Host
оставалась открытой для сеанса до пользователь нажимает Enter; например, Read-Host "Press Enter to exit"
- обратите внимание, что, хотя это позволяет вам проверять вывод сценария, вы не сможете поддерживать сеанс таким образом; все, что вы делаете, это откладываете закрытие окна.
(c) Для заданного файла ярлыка , указывающего на файл *.ps1
, измените свойства файла ярлыка, заменив поле Target:
в диалоговом окне «Свойства» для явного вызова PowerShell с -NoExit
; например, если поле Target:
содержит c:\scripts\foo.ps1
, замените его на
powershell.exe -NoExit -File "c:\scripts\foo.ps1"
.
Обновление команды контекстного меню Run in PowerShell
, чтобы поддержать сеанс после выполнения скрипта.
Важно : Команда Run in PowerShell
может быть недоступной в некоторых версиях Windows 10. Например, на моем компьютере под управлением Windows 10, версия 1803, Приведенная ниже методика не работает: хотя определение команды все еще присутствует в реестре на HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\0
, File Explorer, по-видимому, игнорирует определения там. Если кто-то знает почему, пожалуйста, сообщите нам.
Неоптимальным обходным решением является определение команды для всех типов файлов; то есть цель 'HKCU:Software\Classes\*\Shell\Run in PowerShell\command'
.
Выполните следующую команду, которая обновляет стандартную команду Run in PowerShell
context-menu для файлов *.ps1
, чтобы выполнить их в новом сеансе PowerShell, который остается открытым после завершения сценария.
Обратите внимание, что областью обновления является текущая учетная запись пользователя (HKCU:
== HKEY_CURRENT_USER
); Вместо этого вы можете использовать HKLM:
(HKEY_LOCAL_MACHINE
), чтобы внести изменения для всех пользователей, но для этого требуется запуск с правами администратора.
$null = New-Item -Force -Path 'HKCU:Software\Classes\Microsoft.PowerShellScript.1\Shell\0\command' |
New-ItemProperty -Force -Name '(default)' -Value "$PSHOME\powershell.exe -NoExit -File `"%1`""
Примечание:
Как и в оригинальной команде, ваш $PROFILE
файл все еще загружен - вы можете отменить это, поместив
-NoProfile
после -NoExit
.
Не делается попытка обойти действующую политику . То есть, если ваша система запрещает выполнение сценариев PowerShell, вызов команды завершится неудачно. Вы можете обойти политику выполнения, поместив
-ExecutionPolicy Bypass
после -NoExit
, но это, очевидно, проблема безопасности.
- Исходное определение команды пытается обойти политику, но только если действующая политика не
AllSigned
; однако, по крайней мере, в Windows 7 эта попытка имеет синтаксическую ошибку и поэтому неэффективна .