假设我有一个文本文件,它包含批处理命令。 我怎样才能从一个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循环在文本文件中处理一系列简单的命令,但这会非常严格。 例如,它将不支持IF
, FOR
, GOTO Label
或CALL :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
正如在以前的答案,有几个命令不会在这个文件中工作,如GOTO
, SETLOCAL
等。 但是,只要可替换参数只使用百分之一(如命令行),多行嵌套if
和for
命令就可以工作。
虽然这个方法在屏幕上显示执行的命令( @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