与 shell 脚本不同,批处理文件是不可执行的吗?
Posted
技术标签:
【中文标题】与 shell 脚本不同,批处理文件是不可执行的吗?【英文标题】:are batch files NOT executable unlike shell scripts? 【发布时间】:2013-01-05 12:21:09 【问题描述】:我正在使用boost.process
来运行带有一些给定输入的外部进程。用户可以指定该外部进程。所以大多数时候用户指定一个shell脚本或批处理脚本。
我只是在做boost::process::launch(_script, arguments, context);
,只要它们可以按预期执行(+x),它既适用于真正的可执行文件,也适用于 shell 脚本。但是当我在 Windows 中运行它时。如果我在_script
中传递一个批处理文件,它不起作用但是如果我指定一个真正的可执行文件,它就会起作用。
这让我觉得在 Windows 中批处理脚本根本不是可执行文件?它们只是通过 cmd.exe 解释的!这是真的吗?
我可以启动cmd.exe
并指定/c _script argv
作为命令行参数。但这不会是跨平台的。
我不想拨打system()
电话,因为我无法完全控制已创建的进程?
【问题讨论】:
Shell 脚本是否可执行? 至少我可以通过boost::process::launch
启动它们
@MartinJames:有点。 #!
是一个 16 位的幻数,它告诉内核“当这个文件被执行时,运行下面的程序将这个文件的名称作为参数传递给它”。该程序当然恰好是脚本的解释器,在本例中是 shell。在 Windows 上,批处理文件不包含这种诡计。
【参考方案1】:
没错,批处理文件不能直接执行,需要命令处理器来运行。
也就是说,解决可移植性问题应该相当简单,并且可以在编译时(通过预处理器宏)或运行时(Windows 特定的环境变量?脚本文件扩展名?)完成。
我可能会选择前者,因为它更健壮。
【讨论】:
排除系统依赖关系的一个好方法是为不同的系统设置不同的头文件,由为编译器设置的包含路径选择。使用预处理器宏通常会造成混乱。也就是说,几乎在任何代码库中都可以看到混乱 它甚至不能保证 Windows 中的所有可执行文件都是批处理脚本。所以检查扩展名中的.bat
会更安全。
@NeelBasu:请记住,cmd /c
可以正确处理可执行文件和批处理文件。
但它不会创建一个cmd
窗口吗?实际上我需要连续运行 100 次可执行文件。所以它不应该弹出 100 个窗口
@NeelBasu:如果使用 Win32 API,您可以通过传递 CREATE_NO_WINDOW 标志来解决这个问题。 Boost 大概有一个等价物,或者是一种传递标志的方式。以上是关于与 shell 脚本不同,批处理文件是不可执行的吗?的主要内容,如果未能解决你的问题,请参考以下文章