将非蝙蝠扩展文件作为batch file运行

假设我有一个文本文件,它包含批处理命令。 我怎样才能从一个batch file运行该文本文件, 而无需重命名。 我也想保留一个可移植的方面,所以没有registry键或这样的。

不重命名的原因也是防止意外closures时剩下的未命名文件。

type some.txt>temp.bat call temp.bat del /q /f temp.bat 

是否正在创建一个临时文件作弊?在这个问题中没有提到作为限制。虽然你可以因为del命令而丢失%ERRORLEVEL% ,但是你可以把它保存在temp变量中:

 type some.txt>temp.bat call temp.bat set temp_el=%errorlevel% del /q /f temp.bat exit /b %temp_el% 

我很确定你不能做你想做的事。 Windows不会让您将操作系统配置为将任何其他扩展程序识别为批处理文件。 只支持.bat.cmd

您可以使用FOR / F循环在文本文件中处理一系列简单的命令,但这会非常严格。 例如,它将不支持IFFORGOTO LabelCALL :Label 。 可能还有其他限制。 在您的主批处理文件中,您可以具有以下内容:

 for /f delims^=^ eol^= %%A in (script.txt) do %%A 

如果你通过一个新的CMD.EXE shell来执行这个命令,那么你也许能够支持IF和/或FOR ,但是你不能保存这个命令可能设置的变量的值。

 for /f delims^=^ eol^= %%A in (script.txt) do cmd /c "%%A" 

最简单的方法是这样的:

 cmd < file.txt 

正如在以前的答案,有几个命令不会在这个文件中工作,如GOTOSETLOCAL等。 但是,只要可替换参数只使用百分之一(如命令行),多行嵌套iffor命令就可以工作。

虽然这个方法在屏幕上显示执行的命令( @echo off在这里不起作用),但是您可以将输出重定向到NUL,并在“Batch”文件中将所需的输出重定向到CON。 例如,这是test.txt

 @echo off echo Hello World! > CON (for /L %a in (1,1,10) do ( echo Turn: %a if %a equ 4 echo TURN NUMBER FOUR! )) > CON 

输出示例:

 C:\> cmd < test.txt > NUL Hello World! Turn: 1 Turn: 2 Turn: 3 Turn: 4 TURN NUMBER FOUR! Turn: 5 Turn: 6 Turn: 7 Turn: 8 Turn: 9 Turn: 10 

请参阅Windows Shell命令

  • assoc 。 将文件扩展名(如* .txt)与文件类型关联起来。
  • ftype 。 让您创建一个新的文件类型,告诉Windows shell如何打开特定类型的文件。

在命令提示符下键入assoc /?ftype /? 将帮助你。 或者用你的google-fu找到MS文档。

*.bat映射到文件类型batfile ; *.cmd映射到文件类型cmdfile 。 在Windows 7中,它们是相同的。 如果您希望能够将名为*.foobar的文件作为批处理文件运行,请键入:

 assoc .foobar=cmdfile 

然后,假设路径上存在一个名为“sillyness.foobar”的文件,您只需键入

 c:\> sillyness 

它会发现sillyness.foobar并将其作为批处理文件执行。 如果文件具有相同的名称和不同的扩展名(.com vs .cmd vs .bat等),Windows shell将优先解决冲突问题。

就像是

 assoc .pl=perlscript ftype perlscript=perl.exe %1 %* 

会设置你运行Perl脚本,就好像它们是.bat文件一样。

如果你的批处理命令是简单的顺序的,那么你可以在命令提示符下使用它。 将%符号加倍以便在批处理文件中使用。

 for /f "delims=" %a in (file.txt) do %a