如何在不使用* .bat扩展名的情况下运行批处理脚本

时间:2012-11-10 08:42:38

标签: execution batch-file

Windows中是否有任何方法可以执行没有* .bat扩展名的批处理脚本?

6 个答案:

答案 0 :(得分:16)

这对我来说是一个有趣的话题!我想对此做一些观察。

重要的一点:批处理文件是扩展名为.BAT或.CMD的文件。期。批处理文件除了执行常用的DOS命令外,还可以实现某些特定的批处理文件工具,特别是:

  • 通过%1%2 ...访问批处理文件参数并执行SHIFT命令。
  • 执行GOTO命令。
  • 执行CALL:NAME命令(内部子程序)。
  • 执行SETLOCAL / ENDLOCAL命令。

现在有趣的部分:任何文件都可以重定向为CMD.exe的输入,因此其中包含的DOS命令以与Batch文件类似的方式执行,但有一些差异。最重要的一点是以前的批处理文件工具不起作用。下面的NOT-Batch文件中说明了另一个不同之处(我称之为BATCH.TXT):

@echo off
rem Echo off just suppress echoing of the prompt and each loop of FOR command
rem but it does NOT suppress the listing of these commands!

rem Pause command does NOT pause, because it takes the character that follows it
pause
X

rem This behavior allows to put data for a SET /P command after it
set /P var=Enter data: 
This is the data for previous command!
echo Data read: "%var%"

rem Complex FOR/IF commands may be assembled and they execute in the usual way:
for /L %i in (1,1,5) do (
   set /P line=
   if "!line:~0,6!" equ "SHOW: " echo Line read: !line:~6!
)
NOSHOW: First line read
SHOW: Second line
NOSHOW: This is third line
SHOW: The line number 4
NOSHOW: Final line, number five

rem You may suppress the tracing of the execution redirecting CMD output to NUL
rem In this case, redirect output to STDERR to display messages in the screen
echo This is a message redirected to STDERR >&2

rem GOTO command doesn't work:
goto label
goto :EOF
rem but both EXIT and EXIT /B commands works:
exit /B

:label
echo Never reach this point...

要执行上一个文件,请键入:CMD / V:ON< BATCH.TXT 需要使用/ V开关来启用延迟扩展。

更专业的差异与NOT-Batch文件中的命令在命令行上下文中执行,而不是批处理文件上下文有关。也许戴夫或杰布可以详细说明这一点。

编辑: 其他观察(batch2.txt):

@echo off
rem You may force SET /P command to read the line from keyboard instead of
rem from following lines by redirecting its input to CON device.

rem You may also use CON device to force commands output to console (screen),
rem this is easier to write and read than >&2

echo Standard input/output operations> CON
echo/> CON
< CON set /P var=Enter value: > CON
echo/> CON
echo The value read is: "%var%"> CON

以这种方式执行上一个文件:CMD&lt; BATCH2.TXT&gt; NUL

编辑更多其他观察(batch3.txt)

@echo off

rem Dynamic access to variables that usually requires DelayedExpansion via "call" trick

rem Read the next four lines; "next" means placed after the FOR command
rem (this may be used to simulate a Unix "here doc")

for /L %i in (1,1,4) do (
   set /P line[%i]=
)
Line one of immediate data
This is second line
The third one
And the fourth and last one...

(
echo Show the elements of the array read:
echo/
for /L %i in (1,1,4) do call echo Line %i- %line[%i]%
) > CON

以通常的方式执行此文件:CMD&lt; BATCH3.TXT&gt; NUL

有趣!不是吗?

编辑:现在,可以在NotBatch.txt文件中模拟GOTO和CALL命令!请参阅this post

安东尼奥

答案 1 :(得分:1)

只需使用:

type mybat.txt | cmd

打破现状...

type mybat.txt读取mybat.txt作为文本文件并打印内容。 |表示捕获命令左侧打印的所有内容,并将其作为输入传递给右侧命令。然后cmd(您可能会猜到)将收到的所有输入解释为命令并执行它们。

如果您想知道...可以将cmd替换为bash以在Linux上运行。

答案 2 :(得分:0)

可能是,但可能也不是一种简单的方式=)首先导致安全。 我试着在一年前和一个月前做同样的事情,但我发现没有解决方案..你可以尝试做

execu.cmd

type toLaunch.txt >> bin.cmd
call bin.cmd
pause > nul
exit

然后在toLaunch.txt put

@echo off
echo Hello!
pause > nul
exit

就像例子一样,它将“编译”代码,然后它将执行“输出”文件,即只是“解析”

而不是解析你也可以只重命名使用,也可以在脚本内部使用toLaunch.txt进行自动重命名

ren %0 %0.txt
希望它有所帮助!

答案 3 :(得分:0)

在我的情况下,为了使Windows运行没有扩展名的文件(仅用于* .cmd,*。exe),我已经错过了pathext变量(在系统varailbles中)以包含.cmd。一旦添加,我没有更多的运行file.cmd而不是简单的文件。

环境变量 - &gt;添加/编辑系统变量以包含.cmd; .exe(当然你的文件应该在路径中)

答案 4 :(得分:0)

在某种程度上是可能的。您需要管理员权限才能运行assocftype命令。还有一个将使用您的代码的“调用者”脚本:

可以说您想要的扩展名为.scr。 然后以管理员身份执行此脚本:

   @echo off
   :: requires Admin permissions
   :: allows a files with .scr (in this case ) extension to act like .bat/.cmd files.
   :: Will create a 'caller.bat' associated with the extension
   :: which will create a temp .bat file on each call (you can consider this as cheating)
   :: and will call it.
   :: Have on mind that the %0 argument will be lost.


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

    rem :: associating file extension
    assoc .scr=scrfile
    ftype scrfile=c:\scrCaller "%%1" %%*

您甚至可以使用GOTO和CALL以及其他已知的技巧。唯一的限制是%0参数将丢失,尽管可以在创建临时文件时对其进行硬编码。 例如,由于许多语言都编译.exe文件,因此我认为这是合法的方法。

答案 5 :(得分:0)

如果要将变量导出到调用批处理文件,则可以使用

for /F "tokens=*" %%g in (file.txt) do (%%g)

此方法有一些局限性(请勿使用::进行注释),但是它非常适合配置文件。

示例:

rem Filename: "foo.conf"
rem 
set option1=true
set option2=false
set option3=true
@echo off
for /F "tokens=*" %%g in (foo.conf) do (%%g)
echo %option1%
echo %option2%
echo %option3%
pause