假设我在我的程序中动态生成了这样的脚本,并将其保存在C ++字符串变量中。我该如何运行?我是否必须先将其保存到文件中,然后指示cmd.exe运行它?
我知道您可以像这样将命令通过管道传递到cmd.exe:
type script.bat | cmd
但是这样做的结果不是运行script.bat。 Windows而是启动一个新的cmd.exe实例,打印徽标并等待它回显到屏幕的命令,然后再执行它们。例如,尝试
echo echo hello | cmd
因此,script.bat中的每一行都作为独立的命令处理,就像您在命令行中输入它一样(这就是cmd.exe认为您正在执行的操作!)。不好您不能运行这样的常规脚本。您可能具有跨越几行的循环和分支。那我该怎么办?
我知道您可以像这样在一行上放置多个命令:
cmd /C "echo hello & echo world"
但是可以将每个批处理脚本以某种方式轻松地更改为一个单行吗?如果脚本是:
@echo off
echo hello
echo world
我可以用上面的onliner替换它,但是如果它包含一个for循环,该循环跨越多个带有括号的行?
因此标题问题可以重新表述为:是否可以将每个批处理脚本转换为一个单行代码?如果是这样,那又如何?如果不是,是否有解决该问题的好方法?我可以以某种方式欺骗cmd.exe认为它从文件中读取批处理脚本,而实际上是从我的程序中获取它的吗?
编辑:一个有趣的怪癖是要做的:
echo echo hello | cmd /C "for /f "tokens=*" %a in ('more') do @%a"
但是同样,每一行都被解释为独立的命令。
答案 0 :(得分:2)
FILE_ATTRIBUTE_TEMPORARY 该文件正在用于临时存储。 文件系统尝试将所有数据保留在内存中,以便更快 访问而不是将数据刷新回大容量存储。临时的 文件应不再被应用程序删除 需要。
FILE_FLAG_DELETE_ON_CLOSE 表示操作系统要 在关闭所有句柄后立即删除文件, 不仅是您为其指定了FILE_FLAG_DELETE_ON_CLOSE的句柄。 后续对该文件的打开请求将失败,除非 使用了FILE_SHARE_DELETE。
https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea
如果使用这些标志指定一个临时文件,则可以批量运行该文件。除非您承受内存压力,否则文件将永远不会在硬盘上。
PS:如果在“打开文件”对话框中键入URL,则记事本将打开Web文件。记事本是潜在系统功能的测试床。
PPS:您可以通过管道传输它。 cmd /c < ..\win.ini
(这没有道理,但Windows中不再有标准的批处理文件)。