PowerShell - прямой запуск графического интерфейса из скрипта PowerShell (.ps1) - PullRequest
1 голос
/ 07 марта 2019

Итак, я только что написал свой первый сценарий PowerShell, который использует Windows Forms для создания и отображения графического интерфейса.

Если я запускаю сценарий в PowerShell ISE или вызываю .ps1 из командной строки PowerShell напрямую, сценарийработает, графический интерфейс появляется и все в порядке.Однако, если я просто дважды щелкну по файлу .ps1, чтобы «запустить» сценарий, приглашение PowerShell быстро откроется и закроется, и графического интерфейса пользователя не будет (он немедленно завершается).

Я что-то упустил?Вот последняя строка в моем скрипте для отображения GUI.

$crsc_main_form.ShowDialog()

Спасибо.

Ответы [ 3 ]

0 голосов
/ 08 марта 2019

Тот факт, что ваш скрипт по крайней мере пытается запустить , указывает на то, что вы настроили свою систему, учитывая, что по умолчанию двойной щелчок по сценариям PowerShell в FileExplorer открывает их для редактирования - см. общую информацию ниже.

Некоторые советы по устранению неполадок :

  • ISE выполняет повторные запуски сценария в одном и том же сеансе, поэтому укажитеЗадержка от предыдущих запусков может повлиять на последующие запуски.

  • Чтобы исключить эти эффекты, запустите ваш скрипт из обычного консольного окна PowerShell.

  • Поместитеследующая строка в верхней части вашего скрипта, чтобы предотвратить немедленное закрытие окна при возникновении ошибки во время выполнения из проводника;это даст вам возможность увидеть сообщение об ошибке:

    trap { Write-Error $_; pause }
    

Запуск сценариев PowerShell из проводника

По умолчанию double-щелчок (открытие) *.ps1 файлов из оболочки Windows (Рабочий стол, Проводник, панель задач, меню «Пуск») не выполняет их - вместо этого они открывается для редактирования в Блокноте или PowerShell ISE, в зависимости от версии Windows / PowerShell.

Однако, поскольку, по крайней мере, в Windows 7, контекстное меню для файлов *.ps1 содержит команду Run with PowerShell , которая выполняет для запуска сценария под рукой, а именно с помощью следующей команды, определенной в разделе реестра [HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\shell\0\Command] (начиная с Windows 10)):

"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-Command" "if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & '%1'"
  • Если не действует политика выполнения AllSigned - в этом случае могут выполняться только сценарии со знаком , но они выполняются без запроса - команда пытается установить политику выполнения для вызванного процессана Bypass, что означает, что любой сценарий может быть выполнен, но только после того, как пользователь ответит на запрос подтверждения заранее (независимо от того, подписан ли сценарий или нет, ибыла загружена из Интернета или нет).

  • По крайней мере в более ранних выпусках Windows 7 / версиях PowerShell команда была неправильно определена [1] таким образом, что фактически игнорируется попытка установить политику выполнения процесса, а это означает, что независимо от того, какая политика выполнения была постоянно настроена, применена - и никакой подсказки подтверждения не отображалось.


Если вы хотите выполнить эффект двойным щелчком / открытием , у вас есть два варианта:

  • Определить файл ярлыка *.lnk для вызова вашего скрипта.

  • Используйте реестр, чтобы переопределить команду Open контекстного меню для *.ps1 файлов в [HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\shell\Open\Command]

    • Предостережение : Это может противоречитьпользователи, привыкшие открывать файлы *.ps1, в результате чего они открываются для редактирования и, следовательно, могут приводить к непреднамеренному выполнению файлов.

[1] Ранее сломанное определение команды было "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-file" "%1" "-Command" "if((Get-ExecutionPolicy ) -ne AllSigned) { Set-ExecutionPolicy -Scope Process Bypass }", что означало, что все, что после -file "%1" было передано как аргументы в файл "%1" вместо запланированного выполнения команд, следующих за-Command;дополнительно - спорный вопрос - операнд AllSigned должен был бы быть заключен в кавычки.

0 голосов
/ 20 марта 2019

Я выяснил, в чем проблема. Ошибка была вызвана расположением моего файла .ps1. Он находился в папке с пробелами, поэтому при попытке его запуска приглашение PowerShell открывалось быстро и закрывалось, и в течение миллисекунды отображалось сообщение об ошибке: «Term $ PATH не распознается как имя командлет ".

«Решением» было переместить файл в место, где в пути нет пробелов (например, C: \ Temp). Возможно, я мог бы настроить свою систему так, чтобы при запуске путь был помещен внутрь "".

0 голосов
/ 08 марта 2019

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

Я предполагаю, что когда вы пытаетесь просто запуститьФайл .ps1, как описано, сеанс ограничен

Попробуйте добавить следующее:

executionpolicy > $env:USERPROFILE\Desktop\executionpolicy.txt

При этом на рабочий стол будет записан текстовый файл, показывающий, какова политика выполнения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...