如何从具有不同路径的.bat中执行.bat?

时间:2015-12-27 18:35:24

标签: windows batch-file cmd

我正在多个位置处理多个.bat文件,我想在一个作业中连接整个工作。所以这就是问题所在:

我有一个名为A A1的文件夹,里面有.bat文件,它正在处理同一个文件夹中的文件。然后是文件夹A B1具有相同的设置。例如:

  • 宽:
    • 项目
      • A A1
        • @ START BAT.bat
        • FILE.avi (60 MB)

  • K:
    • 项目
      • A B1
        • @ START BAT.bat
        • FILE.avi (80 MB)

请注意不同的驱动器!

所以此时我想运行W:\PROJÉČŤ\A A1\@ START BAT.bat,当这个批处理文件执行了所有已编写的命令时,我想从第一个K:\PROJÉČŤ\A B1\@ START BAT.bat自动启动第二批文件W:\PROJÉČŤ\A A1\@ START BAT.bat

我的批处理脚本:

W:\PROJÉČŤ\ A A1 \ @ START BAT.bat

IF EXIST "*.avi" (
    IF NOT EXIST "FILE.avi" (
        REN "*.avi" FILE.avi
    )
    ATTRIB -R "FILE.avi"
    IF EXIST "FILE.avi" (
        ATTRIB -R "FILE.avi"
    )
)
REM ???
PAUSE
EXIT 

K:\PROJÉČŤ\ A B1 \ @ START BAT.bat

IF EXIST "*.avi" (
    IF NOT EXIST "FILE.avi" (
        REN "*.avi" FILE.avi
    )
    ATTRIB -R "FILE.avi"
    IF EXIST "FILE.avi" (
        ATTRIB -R "FILE.avi"
    )
)
PAUSE
EXIT

我想我只需要用{/ 1>这样的命令替换REM ???的行

START "K:\PROJÉČŤ\A B1\@ START BAT.bat"

但遗憾的是,下面列出的命令无效:

START "K:\PROJÉČŤ\A B1\@ START BAT.bat"
CALL "K:\PROJÉČŤ\A B1\@ START BAT.bat"
START CALL "K:\PROJÉČŤ\A B1\@ START BAT.bat"
START cmd /K CALL"K:\PROJÉČŤ\A B1\@ START BAT.bat"

目录K:\PROJÉČŤ\A B1中的批处理文件未在目录W:\PROJÉČŤ\A A1的批处理文件中执行。

请问任何想法?

2 个答案:

答案 0 :(得分:0)

在文件名中包含空格很好,而@不是需要转义的字符。也就是说,有时更容易命名没有特殊字符或空格的批处理文件,并在my-cool-script.bat之类的单词之间使用破折号。

这是一个应该模仿您正在做的事情的例子,它可以帮助您调试脚本。

Directory of L:\test

12/27/2015  11:12 AM    <DIR>          .
12/27/2015  11:12 AM    <DIR>          ..
12/27/2015  11:12 AM               118 @ start one.bat
12/27/2015  11:08 AM                56 @ start two.bat

L:\test>"@ start one.bat"
ONE
Running "@ start one.bat"
Calling @ start two.bat
TWO
Running "L:\test\@ start two.bat"
Bye from "L:\test\@ start two.bat"
Bye from "@ start one.bat"

以下是批处理文件的内容:

L:\test>type *.bat

@ start one.bat


@echo off
echo ONE
echo Running %0
echo Calling @ start two.bat
call "L:\test\@ start two.bat"
echo Bye from %0

@ start two.bat


@echo off
echo TWO
echo Running %0
echo Bye from %0

如果文件位于不同的目录中,这也有效:

Directory of L:\test

12/27/2015  11:35 AM    <DIR>          one
12/27/2015  11:35 AM    <DIR>          two

Directory of L:\test\one

12/27/2015  11:35 AM               116 @ start one.bat

Directory of L:\test\two

12/27/2015  11:35 AM                54 @ start two.bat

L:\test>"one\@ start one.bat"
ONE
Running "one\@ start one.bat"
Calling @ start two.bat
TWO
Running "L:\test\two\@ start two.bat"
Bye from "L:\test\two\@ start two.bat"
Bye from "one\@ start one.bat"

第一个bat文件的更新内容:

L:\test>type "one\@ start one.bat"
@echo off
echo ONE
echo Running %0
echo Calling @ start two.bat
call "L:\test\two\@ start two.bat"
echo Bye from %0

另一个更新,显示如何引用脚本的当前目录,而不仅仅是脚本开始位置的“当前目录”。

%~dp0是关键......

L:\test>dir /s
Directory of L:\test
12/27/2015  03:12 PM    <DIR>          one
12/27/2015  03:12 PM    <DIR>          two

Directory of L:\test\one
12/27/2015  03:17 PM               170 @ start one.bat
12/27/2015  03:12 PM                 8 file.txt

Directory of L:\test\two
12/27/2015  03:17 PM               104 @ start two.bat
12/27/2015  03:12 PM                13 file.txt

ONE

@echo off
echo ONE
echo Running %0
echo From Directory: %~dp0
echo Calling @ start two.bat
dir "%~dp0\file.txt"
call "L:\test\two\@ start two.bat"
echo Bye from %0

TWO

@echo off
echo TWO
echo Running %0
echo From Directory: %~dp0
dir "%~dp0\file.txt"
echo Bye from %0

输出

L:\test>"one\@ start one.bat"
ONE
Running "one\@ start one.bat"
From Directory: L:\test\one\
Calling @ start two.bat

Directory of L:\test\one

12/27/2015  03:12 PM                 8 file.txt
           1 File(s)              8 bytes

TWO
Running "L:\test\two\@ start two.bat"
From Directory: L:\test\two\

Directory of L:\test\two

12/27/2015  03:12 PM                13 file.txt
           1 File(s)             13 bytes
Bye from "L:\test\two\@ start two.bat"
Bye from "one\@ start one.bat"

L:\test>

您应该拥有修复脚本所需的一切。

答案 1 :(得分:0)

不要将批处理文件命名为Windows命令处理器的内部命令或存储在Windows的system32目录中的标准Windows控制台应用程序。 @ START BAT.bat绝对不是批处理文件的好名称,因为它包含命令start,文件名中有空格而@在文件名中也很不寻常,这就是为什么这个字符的原因多年前被选为电子邮件地址中的分隔符。

任务在FILE.aviFILE.avi的每个子文件夹中重命名(希望)一个未命名为"W:\PROJÉČŤ"K:\PROJÉČŤ的AVI文件并删除只读属性可以通过以下方式完成以下批处理代码保存到AviFileRename.bat

@echo off
call :AviFileRename "W:\PROJÉČŤ"
call :AviFileRename "K:\PROJÉČŤ"
goto :EOF

:AviFileRename
for /R %1 %%# in (*.avi) do (
    if /I "%%~n#" == "FILE" (
        %SystemRoot%\System32\attrib.exe -r "%%#"
    ) else (
        ren "%%#" "FILE.avi"
        %SystemRoot%\System32\attrib.exe -r "%%~dp#FILE.avi"
    )
)

使用这些代码行保存哪个目录AviFileRename.bat无关紧要。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • attrib /?
  • call /?
  • echo /?
  • for /?
  • goto /?
  • if /?
  • ren /?

命令调用通常可用于继续处理子批次上的主批次,并且在处理此子批次完成后,继续处理主批次。有关详细信息,请参阅How to call a batch file in the parent folder of current batch file?

上的答案

但是没有选项/B的命令退出会导致退出整个命令进程,而不仅仅是处理当前批处理文件。有关详细信息,请参阅In a Windows batch file, can you chain-execute something that is not another batch file?上的答案,并在命令提示符窗口exit /?中阅读有关运行的帮助输出。解决方案是使用命令 start 在新的命令进程中运行批处理文件。

但只是使用

START "K:\PROJÉČŤ\A B1\@ START BAT.bat"

是不够的,因为

  1. 命令 start 将双引号中的第一个字符串解释为可选标题 - 在命令提示符窗口start /?中运行以获取详细信息;

  2. 当前目录未设置为@ START BAT.batK:\PROJÉČŤ\A B1中所有行所需的已启动批处理文件的目录。

  3. 工作命令行将是:

    start "Processing A B1" /D"K:\PROJÉČŤ\A B1" "K:\PROJÉČŤ\A B1\@ START BAT.bat"
    

    此命令放入W:\PROJÉČŤ\A A1\@ START BAT.bat而不是命令 REM 的行可以使用。

    参数说明请参考start /?

    的输出
    1. "Processing A B1" ...新流程窗口的标题。也可以是用""指定的空字符串。但是作为窗口标题的人类可读的东西总是比没有标题的控制台窗口更好。如果在命令行中使用双引号指定了任何其他参数,则需要标题字符串。

    2. /D"K:\PROJÉČŤ\A B1" ...定义新命令进程的工作目录。

    3. "K:\PROJÉČŤ\A B1\@ START BAT.bat" ...在这种情况下,要启动的命令/可执行文件/脚本是目录@ START BAT.bat中的批处理文件K:\PROJÉČŤ\A B1

    4. 您可能希望在/wait之后另外添加 start 参数/D"K:\PROJÉČŤ\A B1",以便在新命令进程中运行批处理文件,并始终停止W:\PROJÉČŤ\A A1\@ START BAT.bat的处理直到启动批处理文件完成并且命令进程已通过命令退出退出,或者当命令处理器处理批处理文件的最后一行时。

      但是文件夹名PROJÉČŤ还有一个问题。它包含非ASCII字符ÉČŤ,因此在用于编辑批处理文件的文本编辑器中设置正确的代码页非常重要,否则将找不到目录PROJÉČŤ。控制台窗口中的代码页取决于Windows区域和语言设置。

      在命令提示符窗口中运行 chcp 显示为计算机上的命令进程定义的代码页。此(通常) OEM 代码页也必须在文本编辑器中使用,而不是文本编辑器通常用于编辑文本文件的ANSI(Windows)代码页。