我们如何知道 ps1 文件是从 CLI 还是 GUI 执行的?

我们如何知道 ps1 文件是从 CLI 还是 GUI 执行的?

ps1 file执行时,我们如何知道该文件是从 CLI 执行的command line还是从 GUI执行的Explorer(文件本身或另一个 ps1 文件)?

我问这个问题有几个原因。其中之一是我们需要pause读取输出,但如果从 CLI 执行,则不需要它。

例如这个文件:

# Test.ps1
#$FromCLI = 
if ($FromCLI) {'Executed From CLI'} else {'Executed From PS1 File; pause'}

需要什么代码$FromCLI=?这样我们就可以区分从 CLI 还是 GUI (ps1 文件) 执行。

答案1

对于您的主要问题,您可以使用类似这样的方法来获取简单的真/假值:

# check if running from CLI window or launched from explorer context menu
$fromCLI = $host.Name -eq "ConsoleHost" -and -not ($MyInvocation.Line -like "if((Get-ExecutionPolicy ) -ne 'AllSigned')*")

根据您需要的原因,您可能还需要检查其他一些事项。例如,以下是您尝试过的最常见的 powershell 控制台的扩展版本:

# show console environment
switch ($Host.Name) {
  'ConsoleHost'                 {Write-Host "Running from CLI"}
  'Windows PowerShell ISE Host' {Write-Host "Running from GUI (Windows PowerShell ISE)"}
  'Visual Studio Code Host'     {Write-Host "Running from GUI (VS Code)"}
  default                       {Write-Host "Running from GUI ($_)" }
}

# command used to launch script
$MyInvocation.MyCommand.Definition

# location of running script itself 
$PSScriptRoot

# process .exe location (pwsh.exe/powershell.exe/PowerShell_ISE.exe/etc)
(ps -id $pid).Path

# parent process, for things like windows terminal which just run PS as a child process
try {(ps -id (Get-CimInstance -Cl Win32_Process -F "processId='$pid'").parentProcessId -ea Stop).path} 
catch {"N/A"}

# check for specific automatic variables:
if ($psISE)   {Write-Host "Running from GUI (Windows PowerShell ISE)"}
if ($psEditor){Write-Host "Running from GUI (VS Code)"}

结果如下:

Running from CLI
C:\folder\check where script was launched from.ps1
C:\folder
C:\Program Files\PowerShell\7\pwsh.exe
C:\WINDOWS\Explorer.EXE

答案2

$最后退出代码

在我尝试了几个自动变量之后:$Host $MyInvocation $? $^ $$ $LastExitCode,我找到了一个适合我目的的变量。对于几种调用格式,它在命令行中始终为 1。
示例:(我不需要pause来自 CLI 的 if)

# Test.ps1
'Hello World'
if ($LastExitCode -ne 1) {Pause}

从 CLI:.\Test.ps1,,& .\Test.ps1。 从其文件或另一个 ps1 文件双击它(pwsh)或右键单击>使用 powershell 运行& "C:\Temp\Test.ps1"

还尝试了功能:

function testF {
    'Hello World'
    if ($LastExitCode -ne 1) {Pause}
}
testF

因此,该函数可以通过附加文件从其文件中执行pause。不需要从 CLI 中执行。

其文件的输出:

Hello World
Press Enter to continue...:

CLI 的输出:

PS7: .\testF.ps1
Hello World

相关内容