当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