如何在当前PowerShell终端运行变量指定的可执行程序
PowerShell 中通过变量指定可执行文件在当前会话运行的实现
正确实现方式
直接使用PowerShell原生调用运算符&执行,和Cmd中%MY_PROGRAM% -my_program_option的执行效果完全一致:
& $MY_PROGRAM -my_program_option
如果MY_PROGRAM是系统环境变量,需替换为PowerShell对应的环境变量读取语法:
& $env:MY_PROGRAM -my_program_option
原写法触发新开终端的原因
之前使用Invoke-Expression "${MY_PROGRAM} -my_program_option"会弹出独立非PowerShell终端,核心问题点:
Invoke-Expression的作用是把传入的字符串当做临时PowerShell脚本解析执行,当解析到非PowerShell原生脚本(如.bat、.cmd批处理)、或路径存在空格需要特殊转义时,PowerShell会自动拉起独立的cmd子进程执行内容,进程完全脱离当前会话,表现为新开窗口,程序输出无法回流到当前会话。- 直接拼接字符串传给
Invoke-Expression,会丢失PowerShell原生命令解析对路径的处理逻辑,带空格的路径会被错误拆分为命令名+参数,进一步触发异常的进程拉起行为。
相关注意事项
- 使用
&调用的控制台程序,标准输出、错误流会直接回流到当前PowerShell终端,无需额外配置。 - 哪怕
MY_PROGRAM存储的是带空格的绝对路径,直接通过&加变量的写法即可正确解析,无需手动拼接引号、处理路径转义。 - 不要在调用逻辑中嵌套
cmd /c、start这类命令,否则会主动触发新窗口启动行为。
内容的提问来源于stack exchange,提问作者Tricky
相关产品推荐
相关产品推荐

