解决方案是使用字符串:
"start %ComSpec% /D /S /C \"(\"C:\\Program Files\\Python\\python.exe\" \"$file\" || set /p =Failed execution. Press Enter to exit...) && set /p =Successful execution. Press Enter to exit...\""
使用 Windows 内核库函数CreateProcess并使用适当的填充STARTUPINFO结构,shell_cmd
导致在后台启动时没有可见的控制台窗口cmd.exe
和选项/c
和在下一个字符串中指定的命令行。
在命令提示符窗口中运行的帮助输出解释了选项后,Windows 命令处理器如何cmd.exe
解释参数字符串。有五个条件定义了在 option (或 option )之后解释参数字符串的一般行为,第一个条件是 option left to option or的使用。/c
cmd /?
/c
/k
/S
/C
/K
用户无法控制Sublime Text 4如何在使用时启动 Windows 命令处理器实例。shell_cmd
在这种情况下在后台执行:
C:\Windows\System32\cmd.exe /c start %ComSpec% /D /S /C "("C:\Program Files\Python\python.exe" "$file" || set /p =Failed execution. Press Enter to exit...) && set /p =Successful execution. Press Enter to exit..."
$file
在启动 Windows 命令处理器之前由Sublime Text 4替换为文件名字符串。
出于这个原因,命令行以Sublime Text 4cmd.exe /c
使用的方式进行编码。免费的 Sysinternals (Microsoft) 工具Process Monitor可用于查看可执行文件启动另一个可执行文件时在后台发生的情况。双击进程监视器日志中的进程并选择选项卡进程后,可以看到命令行用于启动进程。
在这种情况下需要一个可见的控制台窗口,这就是为什么使用内部命令start
来启动另一个cmd.exe
. 使用start
导致再次使用该函数CreateProcess
,但这次是由Sublime Text 4cmd
启动的实例,通过启动可执行文件使用填充打开一个新的控制台窗口。STARTUPINFO
CreateProcess
cmd.exe
通过引用预定义的 Windows 环境变量的值来指定要启动的可执行文件的完整限定文件名,ComSpec
在执行command 之前,该变量已由已安装的 Windows 上%ComSpec%
的第一个启动cmd.exe
实例扩展。是默认定义的系统环境变量。所以也可以在命令行字符串中替换为。C:\Windows\System32\cmd.exe
C:\Windows
start
ComSpec
%SystemRoot%\System32\cmd.exe
%ComSpec%
%SystemRoot%\\System32\\cmd.exe
第二个实例cmd
应该从忽略AutoRun
Windows 注册表中默认不存在的注册表字符串值开始。这是为了安全,使第二个cmd
实例的启动过程更快一点。有关选项/D
和AutoRun
注册表字符串值的更多信息,可以cmd /?
在命令提示符窗口中运行的 Windows 命令处理器输出的帮助中阅读。
该选项/S
用于明确定义第二个cmd
实例应如何解释下一个选项之后的参数字符串,该选项/C
用于执行命令行并cmd
在完成命令行执行后关闭。
要执行的命令行包含条件运算符&&
,并通过使用 Windows 批处理文件和两个等号的多条命令的单行||
进行详细说明。出于这个原因,强烈建议将整个命令行字符串包含在其中以获取这些运算符,并且等号由Sublime Text 4在解析 option 之后的参数字符串时启动的第一个实例解释为文字字符,即整个编码的命令行细绳。"
cmd
/c
第二个实例从 option 之后的参数字符串cmd
中删除第一个和最后一个,因为 option并解释剩余的命令行以执行。"
/C
/S
可以读取cmd
包含空格或这些字符之一&()[]{}^=;!'+,`~
(也<>|
不可能在文件名中)的文件名(或任何其他参数字符串)必须包含在其中"
以被解释为文字字符。C:\Program Files\Python\python.exe
包含一个空格字符,它在不在双引号参数字符串内时被解释为参数字符串分隔符。因此,必须将 Python 可执行文件的完整限定文件名包含在"
其中以解释为一个参数字符串,而不是两个参数字符串C:\Program
和Files\Python\python.exe
.
使用||
and &&
使得 Python 的执行以及在以不等于 0 的退出值时set
执行的命令python.exe
被组合在一个命令块中,通过使用一对(
and)
来获得set
执行后的命令,&&
仅当python.exe
以值退出时0 表示成功执行 Python 脚本。
使用引起的特殊要求||
见&&
:
cmd
因此,带有可见控制台窗口的第二个启动实例运行命令行:
("C:\Program Files\Python\python.exe" "$file" || set /p =Failed execution. Press Enter to exit...) && set /p =Successful execution. Press Enter to exit...
在通过内部命令成功启动第二个实例后cmd
,Sublime Text 4首先启动的实例已经自行关闭。换句话说,第二个使用控制台窗口和第二个的输入、输出和错误流执行,而第一个已经退出本身,这意味着对于Sublime Text 4,该工具的执行已经完成,尽管在真正的第二个并且仍然是跑步。cmd
start
cmd
python.exe
CreateProcess
STARTUPINFO
cmd
cmd
cmd.exe
python.exe