如何判断PowerShell处于REPL模式还是通过“用PowerShell运行”执行?
检测PowerShell脚本的运行方式(右键“用PowerShell运行” vs 交互式Shell执行)
可以通过内置变量和环境属性的组合判断脚本的运行方式,核心是区分临时启动的非交互式PowerShell进程(右键运行场景)和交互式REPL会话(手动打开PowerShell后执行脚本的场景)。
核心判断逻辑
右键“用PowerShell运行”脚本时,PowerShell会以非交互式模式启动,直接加载执行脚本,没有用户输入的命令行记录;而在交互式Shell中执行时,会有明确的命令行执行记录,且会话处于交互式状态。
实现代码
将以下代码添加到脚本末尾,即可实现按需暂停:
# 判断是否为右键"用PowerShell运行"的场景 $isRightClickLaunch = [string]::IsNullOrEmpty($MyInvocation.Line) -and (-not $Host.Interactive) # 补充判断:通过`powershell.exe -File 脚本路径`启动的场景(和右键运行行为一致)也触发暂停 if (-not $isRightClickLaunch) { $isRightClickLaunch = [Environment]::CommandLine -match '-File\s+["'']?[^"''\s]+["'']?$' -and (-not $Host.Interactive) } if ($isRightClickLaunch) { Write-Host "脚本执行完成,按任意键退出..." $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") } else { Write-Host "脚本执行完成" }
关键变量说明
$MyInvocation.Line:存储触发脚本执行的命令行内容,右键运行时该值为空(无用户输入的执行命令)。$Host.Interactive:标记当前PowerShell会话是否为交互式,右键运行时为$false,手动打开的Shell中为$true。[Environment]::CommandLine:获取启动当前PowerShell进程的完整命令行,右键运行时会包含-File参数指向脚本路径。
补充说明
如果用户手动在命令行用powershell.exe -File .\myscript.ps1启动脚本,这种场景下窗口也会在脚本结束后关闭,上述逻辑会自动触发暂停,符合需求。
内容的提问来源于stack exchange,提问作者Warren Spencer
相关产品推荐
相关产品推荐

