Назад | Перейти на главную страницу

Определите, запускался ли сценарий PowerShell с рабочего стола или из командной строки

Проводник Windows (рабочий стол) может запускать сценарий PowerShell, щелкнув правой кнопкой мыши и выбрав «Запуск с PowerShell». Однако, поскольку окно закрывается после завершения сценария, все сообщения теряются. Так что в конце можно было наклеить «Нажмите любую клавишу». Однако при запуске из командной строки PowerShell это было бы очень неприятно.

Есть ли способ для PowerShell определить, откуда он был запущен? Конкретно рабочий стол?

Запускаем с PowerShells $myinvocation.line берется из соответствующего раздела реестра. Например, на (мой) Windows 8.1 с участием PS версия 5.1:

PS D:\PShell> $auxRegKey='\SOFTWARE\Classes\Microsoft.PowerShellScript.1\Shell\0\Command'
PS D:\PShell> (get-itemproperty -literalpath HKLM:$auxRegKey).'(default)'
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-Command" "if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & '%1'"
PS D:\PShell>

Следующий фрагмент кода может помочь:

'script ouput here'
$auxRegKey='\SOFTWARE\Classes\Microsoft.PowerShellScript.1\Shell\0\Command'
$auxRegVal=(get-itemproperty -literalpath HKLM:$auxRegKey).'(default)'
$auxRegCmd=$auxRegVal.Split(' ',3)[2].Replace('%1', $MyInvocation.MyCommand.Definition)
if ("`"$($myinvocation.Line)`"" -eq $auxRegCmd) {
    $MyInvocation.MyCommand.Definition + ': supposedly run via explorer right click'
    $x = Read-Host
} else {
    $MyInvocation.MyCommand.Definition + ': run from CLI'    # optional
}

В сценарии говорится якобы потому что мы могли представить себе следующее (невероятный) команда из открытого cmd окно (или даже его эквивалент из PowerShell Подсказка):

==> "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-Command" "if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & 'D:\PShell\SF\q866281.ps1'"
script ouput here
D:\PShell\SF\q866281.ps1: supposedly run via explorer right click

==>

Есть переменная с именем $myinvocation вернет InvocationInfo Class объект. Он содержит различную информацию о том, как был вызван скрипт. https://msdn.microsoft.com/en-us/library/system.management.automation.invocationinfo(v=vs.85).aspx

Вы можете сделать что-то подобное, чтобы достичь своей цели.

"hello world"
if ($myinvocation.line) {
    "run from cli"
} else {
    "run via explorer right click"
    $x = read-host
}