将非 bat 扩展文件作为批处理文件运行
Posted
技术标签:
【中文标题】将非 bat 扩展文件作为批处理文件运行【英文标题】:Running a non bat extension file as a batch file 【发布时间】:2014-01-20 19:16:52 【问题描述】:假设我有一个文本文件,它包含批处理命令。我怎样才能将文本文件作为批处理文件从一个文件中运行,而不重命名它。我也想保留一个可移植的方面,所以没有注册表键之类的。
不重命名的原因是为了防止意外关闭时遗留未重命名的文件。
【问题讨论】:
【参考方案1】:最简单的方法是这样的:
cmd < file.txt
与前面的答案一样,有几个命令在此文件中不起作用,例如GOTO
、SETLOCAL
等。然而,多行嵌套的if
和for
命令do 工作,只要可替换参数只使用百分之一(如在命令行中)。
虽然此方法总是在屏幕上显示已执行的命令(@echo off
在此处不起作用),但您可以将输出重定向到 NUL,并在“批处理”文件中将所需的输出重定向到 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
【讨论】:
更多细节在这里:***.com/questions/13320578/…【参考方案2】:type 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%
【讨论】:
【参考方案3】:我很确定你不能做你想做的事。 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"
【讨论】:
既然做不到,那有没有更高效的重命名方式呢?即温度之类的?set
可以通过将所有内容放在一个变量中并用&
分隔命令来“保存”。但是由于可变长度限制,大文件将不起作用。括号可能会导致一个问题。
我总是重命名它,调用它,再重命名它。我是用 Ren 做的。例如ren C:\users\Jared\runMe.txt runMe.bat
【参考方案4】:
查看 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 %*
将设置您像运行 .bat 文件一样运行 perl 脚本。
【讨论】:
它只是产生一个新的 cmd 实例。【参考方案5】:如果您的批处理命令是简单的顺序命令,那么您可以在命令提示符下使用它。将%
符号加倍以在批处理文件中使用。
for /f "delims=" %a in (file.txt) do %a
【讨论】:
以上是关于将非 bat 扩展文件作为批处理文件运行的主要内容,如果未能解决你的问题,请参考以下文章