Determine se o script do PowerShell foi executado na área de trabalho ou na linha de comando [closed]

4

O Windows Explorer (desktop) tem a capacidade de executar um script do PowerShell clicando com o botão direito do mouse e selecionando "Executar com o PowerShell". No entanto, como a janela é fechada quando o script termina, todas as mensagens são perdidas. Então, pode-se colocar uma "Pressione qualquer tecla" no final. No entanto, isso seria muito irritante quando executado no prompt de comando do PowerShell.

Existe uma maneira de o PowerShell determinar de onde foi executado? Especificamente, a área de trabalho?

    
por Rob Nicholson 01.08.2017 / 15:24

2 respostas

4

Executar com o PowerShell s $myinvocation.line é obtido da chave de registro correspondente. Por exemplo, no (meu) Windows 8.1 com PS versão 5.1 :

PS D:\PShell> $auxRegKey='\SOFTWARE\Classes\Microsoft.PowerShellScript.1\Shell
'script ouput here'
$auxRegKey='\SOFTWARE\Classes\Microsoft.PowerShellScript.1\Shell
==> "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

==>
\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 }
\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>

O snippet de código a seguir pode ajudar:

PS D:\PShell> $auxRegKey='\SOFTWARE\Classes\Microsoft.PowerShellScript.1\Shell
'script ouput here'
$auxRegKey='\SOFTWARE\Classes\Microsoft.PowerShellScript.1\Shell
==> "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

==>
\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 }
\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>

O script diz supostamente porque poderíamos imaginar o seguinte comando ( improvável ) a partir de uma janela cmd aberta (ou até mesmo o seu equivalente PowerShell prompt):

%pre%     
por 01.08.2017 / 23:35
2

Existe uma variável chamada $myinvocation que retornará um objeto InvocationInfo Class . Ele contém várias informações sobre como o script foi chamado. link

Você pode fazer algo assim para alcançar seu objetivo.

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

Tags