首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在具有不同路径的.bat中执行.bat?

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

Stack Overflow用户
提问于 2015-12-27 18:35:24
回答 2查看 1.5K关注 0票数 1

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

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

  • W:
    • PROJ
      • A A1
        • @ START BAT.bat
        • FILE.avi ( 60 MB)

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

请注意不同的驱动器!

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

我的批处理脚本:

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

我想我只需要用REM ???替换行,如下所示

代码语言:javascript
复制
START "K:\PROJÉČŤ\A B1\@ START BAT.bat"

但不幸的是,下面列出的命令没有起作用:

代码语言:javascript
复制
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中的批处理文件中执行。

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-27 19:45:33

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

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

代码语言:javascript
复制
@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 /?

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

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

但只是用

代码语言:javascript
复制
START "K:\PROJÉČŤ\A B1\@ START BAT.bat"

是不够的因为

  1. 命令启动将双引号中的第一个字符串解释为可选的标题-在命令提示符窗口start /?中运行以了解详细信息;
  2. 当前目录没有按照@ START BAT.batK:\PROJÉČŤ\A B1中行的要求设置为已启动批处理文件的目录。

一个有效的命令行是:

代码语言:javascript
复制
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" ...要启动的命令/可执行/脚本在本例中是目录K:\PROJÉČŤ\A B1中的批处理文件K:\PROJÉČŤ\A B1

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2015-12-27 19:18:17

在您的文件名中有空格是可以的,并且@不是一个需要转义的字符。也就是说,有时在没有特殊字符或空格的情况下命名批处理文件并在单词(如my-cool-script.bat )之间使用破折号要容易得多。

下面是一个应该模仿您正在做的工作的示例,它可以帮助您调试脚本。

代码语言:javascript
复制
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"

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

代码语言:javascript
复制
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

如果文件位于不同的目录中,这也是可行的:

代码语言:javascript
复制
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文件的更新内容:

代码语言:javascript
复制
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是这里的关键..。

代码语言:javascript
复制
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

代码语言:javascript
复制
@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

代码语言:javascript
复制
@echo off
echo TWO
echo Running %0
echo From Directory: %~dp0
dir "%~dp0\file.txt"
echo Bye from %0

输出

代码语言:javascript
复制
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>

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34483548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档