C++ 与shell脚本不同,批处理文件是否不可执行?

C++ 与shell脚本不同,批处理文件是否不可执行?,c++,windows,boost,process,win32-process,C++,Windows,Boost,Process,Win32 Process,我正在使用boost.process来运行一个具有某些给定输入的外部进程。用户可以指定该外部进程。因此,大多数情况下,用户都会指定一个shell脚本或批处理脚本 我只是在做boost::process::launch(_脚本、参数、上下文),只要它们是可执行的(+x),它就可以同时工作于实际可执行文件和shell脚本。但当我在windows中运行它时。如果我在\u script中传递一个批处理文件,它将不起作用,但是如果我指定一个真正的可执行文件,它将起作用 这让我觉得在Windows中批处理脚

我正在使用
boost.process
来运行一个具有某些给定输入的外部进程。用户可以指定该外部进程。因此,大多数情况下,用户都会指定一个shell脚本或批处理脚本

我只是在做
boost::process::launch(_脚本、参数、上下文),只要它们是可执行的(+x),它就可以同时工作于实际可执行文件和shell脚本。但当我在windows中运行它时。如果我在
\u script
中传递一个批处理文件,它将不起作用,但是如果我指定一个真正的可执行文件,它将起作用

这让我觉得在Windows中批处理脚本根本不是可执行文件?它们只是通过cmd.exe进行解释!这是真的吗

我可以启动
cmd.exe
,并将
/c\u脚本argv
指定为命令行参数。但这不会是跨平台的


我不想调用
system()
,因为我无法完全控制创建的进程?

没错,批处理文件不是直接可执行的,需要命令处理器来运行它们

也就是说,解决可移植性问题应该相当简单,可以在编译时(通过预处理器宏)或运行时(特定于Windows的环境变量?脚本文件名扩展?)完成


我可能会选择前者,因为前者更健壮。

Shell脚本是可执行的?至少我可以通过
boost::process::launch
@MartinJames:某种方式启动它们<代码>#
是一个16位的幻数,它告诉内核“当执行此文件时,运行以下程序,并将此文件的名称作为参数传递给它”。当然,程序恰好是脚本的解释器,在本例中是shell。在Windows上,批处理文件不包含这样的技巧。一个解决系统依赖关系的好方法是为不同的系统设置不同的头,由编译器设置的包含路径选择。使用预处理器宏通常会造成混乱。也就是说,人们在几乎所有基于代码的代码中观察到的混乱甚至不能保证windows中的所有可执行文件都是批处理脚本。因此,在扩展名中检查
.bat
更安全。@NeelBasu:请记住
cmd/c
可以正确地处理可执行文件和批处理文件。但是它不会创建一个
cmd
窗口吗?实际上,我需要连续运行可执行文件100次。所以它永远不会出现100个windows@NeelBasu:如果使用Win32 API,您可以通过传递CREATE_NO_窗口标志来解决此问题。Boost大概有一个等价物,或者说是一种让旗子通过的方式。