我可以从内存中运行Windows批处理脚本吗?

时间:2019-11-29 16:08:35

标签: windows batch-file cmd

假设我在我的程序中动态生成了这样的脚本,并将其保存在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"

但是同样,每一行都被解释为独立的命令。

1 个答案:

答案 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中不再有标准的批处理文件)。

相关问题