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不允许你配置操作系统识别其他扩展名作为批处理文件。只有.bat
和.cmd
被支持。
你可以使用FOR /F循环在文本文件中处理一系列简单命令,但它将非常受限制。例如,它将不支持IF
,FOR
,GOTO标签
或CALL :标签
。可能还有其他限制。在你的主批处理文件中,你可以写入以下内容:
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"
ren C:\users\Jared\runMe.txt runMe.bat
- Mark Deventype some.txt>temp.bat
call temp.bat
del /q /f temp.bat
创建临时文件算作作弊吗?问题中没有提到此限制。虽然您可能会因为del命令而失去%ERRORLEVEL%
,但是您可以将其保存在临时变量中:
type some.txt>temp.bat
call temp.bat
set temp_el=%errorlevel%
del /q /f temp.bat
exit /b %temp_el%
查看 Windows Shell 命令
assoc
。将文件名扩展名(例如 *.txt)与文件类型关联。ftype
。允许您创建一个新的文件类型,告诉 Windows Shell 如何打开特定类型的文件。从命令提示符中,键入 assoc /?
或 ftype /?
将获取有关它们的帮助。或使用您的 Google 技能找到 MS 文档。
*.bat
映射到文件类型 batfile
;*.cmd
映射到文件类型 cmdfile
。在 Windows 7 中它们是相同的。如果您想要运行名为 *.foobar
的文件作为批处理文件,只需键入:
assoc .foobar=cmdfile
c:\> sillyness
这段代码将会查找 sillyness.foobar
并将其作为批处理文件执行。当您拥有相同名称但不同扩展名(如 .com vs .cmd vs .bat)的文件时,Windows shell 会按照一定优先级解决冲突。
类似于:
assoc .pl=perlscript
ftype perlscript=perl.exe %1 %*
这将使您能够像运行.bat文件一样运行Perl脚本。
%
符号。for /f "delims=" %a in (file.txt) do %a