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

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

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

【问题讨论】:

    标签: windows batch-file cmd portability


    【解决方案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
    

    【讨论】:

    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-30
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 2022-01-05
        • 1970-01-01
        相关资源
        最近更新 更多