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

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

Windows 资源管理器(桌面)能够通过右键单击并选择“使用 PowerShell 运行”来运行 PowerShell 脚本。但是,由于脚本完成后窗口会关闭,因此所有消息都会丢失。因此,可以在末尾添加“按任意键”。但是,从 PowerShell 命令提示符运行时,这会非常烦人。

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

答案1

使用 PowerShell 运行s$myinvocation.line取自相应的注册表项。例如​​,在 (my)Windows 8.1PS 版本 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

==>

答案2

有一个名为的变量$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
}

相关内容