确定PowerShell脚本是否已从桌面或命令行运行

Windows资源pipe理器(桌面)可以通过右键单击并select“使用PowerShell运行”来运行PowerShell脚本。 但是,当脚本结束时窗口closures,任何消息都将丢失。 所以人们可以坚持一个“按任意键”的结尾。 但是,从PowerShell命令提示符运行时,这会非常烦人。

PowerShell有没有办法确定它从哪里运行? 具体来说,桌面?

使用PowerShell运行 s $myinvocation.line取自相应的registry项。 例如,在具有PS版本5.1的 (我的) Windows 8.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的variables将返回一个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 }