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

4
假设我有一个文本文件,其中包含批处理命令。如何在不重命名的情况下从其中一个批处理文件中运行该文本文件?我希望它具有可移植性,因此不能使用注册表键等。不重命名的原因是为了防止意外关闭时留下未重命名的文件。
5个回答

4
最简单的方式是这样的:
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

更多细节请参见:https://dev59.com/jGYr5IYBdhLWcg3w499-#13337597 - Aacini

3

我很确定你无法实现你想要的功能。Windows不允许你配置操作系统识别其他扩展名作为批处理文件。只有.bat.cmd被支持。

你可以使用FOR /F循环在文本文件中处理一系列简单命令,但它将非常受限制。例如,它将不支持IFFORGOTO标签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"

既然不能这样做,那么重命名的更有效的方法是什么呢?例如使用temp或其他方式? - Jared Allard
“set” 可以通过将所有内容放入一个变量中,并使用 “&” 分隔命令来“保存”。但是对于大文件,由于变量长度限制,这种方法不起作用。而且括号可能会引起问题。 - npocmaka
我总是重命名它,调用它,再次重命名它。我使用Ren来完成。例如 ren C:\users\Jared\runMe.txt runMe.bat - Mark Deven

3
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% 

1

查看 Windows Shell 命令

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

从命令提示符中,键入 assoc /?ftype /? 将获取有关它们的帮助。或使用您的 Google 技能找到 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实例。 - Jared Allard

0
如果您的批处理命令是简单的顺序命令,那么您可以在命令提示符下使用它。在批处理文件中使用双倍的 % 符号。
for /f "delims=" %a in (file.txt) do %a

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接