命令提示符:执行任何文本文件中的命令(没有“.bat”或“.cmd”扩展名)

4
我找不到任何方法来实现以下操作,例如:cmd.exe /C "script.txt"。换句话说,如果文件包含有效的批处理脚本代码,我需要命令提示符尝试执行任何扩展名(不一定是 .bat.cmd)的文件。我正在寻找类似于Unix shell的行为:./script.txt。在Unix上,shebang (#!/bin/sh) 负责理解文件实际上是一个脚本,而在Windows上,.bat.cmd 扩展名似乎扮演着相同的角色,指示命令提示符为批处理脚本文件。是否有可能避免这种情况,强制命令提示符解释任何名称的文件?请注意:不要回答如下内容:给你的文件加上 .bat.cmd 扩展名。这不是问题的关键。

3
把你的扩展名改成.bat.cmd吧 ;)(忍不住说了...) - Benjamin Trent
https://dev59.com/xmw15IYBdhLWcg3wG4EJ - user330315
@a_horse_with_no_name:我知道这种方法,我在发帖之前已经尝试过了。它失败的主要原因是无法执行 cmd.exe /C ""%1" %*",因为 %1 将具有 .foo 扩展名而不是 .bat.cmd。因此,这种方法也不起作用... - Alexander Shukaev
这是一个黑客问题,可能更适合Superuser.com。 - foxidrive
2个回答

6
这取决于非批处理文件的复杂性。如果非批处理文件不使用以下功能:
  • 通过%1 %2 ...访问批处理文件参数并执行SHIFT命令。
  • 执行GOTO命令。
  • 执行CALL:NAME命令(内部子程序)。
  • 执行SETLOCAL / ENDLOCAL命令。
那么您可以通过这个技巧将任何文件作为“批处理文件”执行:
cmd < anyFile.ext

详细信息请参考此篇文章


限制相当严格,说实话。不管怎样,很高兴知道在某些情况下这可能是一个选项。谢谢。 - Alexander Shukaev

3

首先需要一个“安装”脚本:

   @echo off

    rem :: A files with .TEST extension will be able to execute batch code but is not perfect as the %0 argument is lost

    rem :: "installing" a caller.
    if not exist "c:\caller.bat" (
       echo @echo off
       echo copy "%%~nx1"  "%%temp%%\%%~nx1.bat" /Y ^>nul
       echo "%%temp%%\%%~nx1.bat"  %%*
    ) > c:\caller.bat

    rem :: associating file extension
    assoc .test=batps
    ftype batps=c:\caller "%%1" %*

那么请尝试一个简单的.test文件:
@echo off
for /l (1;1;10) do (
  echo testing .TEST extension
)

实际上,ASSOCFTYPE都有立即生效的效果,因此您可以在“安装”后立即启动.test文件。通过直接编辑注册表,您最终可以获得更多控制权->如何创建行为类似于.cmd/.bat的文件扩展名?。还要检查下拉处理程序 -> http://msdn.microsoft.com/en-us/library/windows/desktop/cc144165%28v=vs.85%29.aspx

我考虑过制作一个重命名的临时副本。确实,那应该可以工作。然而,那感觉太过于hackish,但据我所见,这可能是唯一可行的解决方案。那个Windows... - Alexander Shukaev
我尝试了很多方法(主要是在注册表中),但我认为这是被禁止的。这是我找到的唯一方法。 - npocmaka
当然它很hackish - 因为你试图做一件hackish的事情! - Harry Johnston
作为一种优化,您可以使用链接而不是实际副本。 - Harry Johnston

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