将非 bat 扩展文件作为批处理文件运行

Posted

技术标签:

【中文标题】将非 bat 扩展文件作为批处理文件运行【英文标题】:Running a non bat extension file as a batch file 【发布时间】:2014-01-20 19:16:52 【问题描述】:

假设我有一个文本文件,它包含批处理命令。我怎样才能将文本文件作为批处理文件从一个文件中运行,而不重命名它。我也想保留一个可移植的方面,所以没有注册表键之类的。

不重命名的原因是为了防止意外关闭时遗留未重命名的文件。

【问题讨论】:

【参考方案1】:

最简单的方法是这样的:

cmd < file.txt

与前面的答案一样,有几个命令在此文件中不起作用,例如GOTOSETLOCAL 等。然而,多行嵌套的iffor 命令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 循环在一个文本文件中处理一系列简单的命令,但它会非常严格。例如,它将不支持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"

【讨论】:

既然做不到,那有没有更高效的重命名方式呢?即温度之类的? set 可以通过将所有内容放在一个变量中并用&amp; 分隔命令来“保存”。但是由于可变长度限制,大文件将不起作用。括号可能会导致一个问题。 我总是重命名它,调用它,再重命名它。我是用 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 扩展文件作为批处理文件运行的主要内容,如果未能解决你的问题,请参考以下文章

bat文件

如何使批处理BAT文件在后台运行而不显示DOS窗口

求个改文件名的dos批处理bat

如何用批处理打开文件

如何将具有不同扩展名的文件作为BAT文件运行[重复]

兔子--bat文件