如何调用一个位于当前批处理文件目录上一级的批处理文件?

20

我正在使用位于folder1\folder2\file.bat的批处理文件。

在父文件夹folder1中有一个批处理文件,我想通过file.bat打开它。

我尝试过使用:

start ..\..\code.bat

但是这会导致一个错误信息,因为找不到该文件。

有什么想法吗?

4个回答

28

我想用一个例子来更好地解释应该使用什么,因为到目前为止发布的答案只适用于当前工作目录是包含批处理文件file.bat的目录。

有以下目录结构:

  • C:\
    • Temp
      • Folder 1
        • Folder 2
          • Example.bat
        • Parent.bat

在执行Example.bat时,当前工作目录为C:\Temp,可以使用以下方法之一:

"Folder 1\Folder 2\Example.bat"

或者使用

"C:\Temp\Folder 1\Folder 2\Example.bat"

批处理文件Parent.bat例如包含:

echo %0 is active.
pause

批处理文件Example.bat已经包含了以下内容:

@echo off
echo Calling Parent.bat ...
rem How to run Parent.bat here?
echo %0 is active.
pause

当前工作目录与包含Example.bat的目录不同的情况下,真正有效的解决方案如下。


使用Parent.bat继续批处理

"%~dp0..\Parent.bat"

%0 引用了批处理文件执行时的第0个参数,它总是指在启动批处理文件时指定的批处理文件名。

但是我们需要的是批处理文件的驱动器和路径,而且不带双引号。因此,使用表达式 %~dp0 来从参数0中获取C:\Temp\Folder 1\Folder 2\

在此路径上附加字符串..\Parent.bat,并且整个新文件名C:\Temp\Folder 1\Folder 2\..\Parent.bat由于空格而用双引号括起来。

在处理完Parent.bat之后,没有返回到Example.bat


像子例程一样调用 Parent.bat

call "%~dp0..\Parent.bat"

命令call会在同一个命令进程(控制台窗口)中执行批处理文件Parent.bat,并暂停Example.bat的执行,直到Parent.bat完成。

Parent.bat处理完成后,批处理继续在Example.bat中的下一行继续执行。

异常情况:
Parent.bat包含命令exit,但没有加上开关/B,因此这会导致命令行解释器cmd.exe立即退出处理Example.batParent.bat

在命令提示符窗口中执行call /?help call命令,以获取有关命令call的简短帮助信息。


启动Parent.bat作为并行进程

start "Parent Batch" "%~dp0..\Parent.bat"

在没有任何参数的情况下使用start命令(标题除外),会在单独的命令进程中执行批处理文件Parent.bat,并在单独的控制台窗口中运行,而不会停止Example.bat的执行。

因此,两个批处理文件同时运行(或多或少)。

注意:
命令start将双引号中的第一个字符串解释为标题。因此,当需要在双引号中指定要启动的批处理文件或应用程序,或者已启动的批处理文件/应用程序的任何参数中有1个或多个空格时,必须明确定义双引号中的标题。

在命令提示符窗口中执行start /?help start,以获取有关start命令的简短帮助信息。


Parent.bat作为单独的进程调用

start "Parent Batch" /wait "%~dp0..\Parent.bat"

使用可选参数/wait的命令start会作为单独的进程(对于批处理文件或控制台应用程序会有一个额外的控制台窗口)执行所启动的批处理文件/应用程序,但会暂停当前批处理文件的执行,直到启动的进程(在新的控制台窗口中运行的Windows应用程序或批处理文件/控制台应用程序)自行终止。


18

..\用于返回上一级目录。你的情况需要返回两级目录。

start ..\..\code.bat

3
对于他的情况,他只需要提升一个级别,或者这是他要求的,如果你读了他的帖子,那就是他试图做的确切事情。 对于.bat文件,你需要使用call而不是start(至少在第二个文件完成后想要在原始的.bat文件中继续): 因此,正确的方式应该是: call ..\code.bat - nivs1978

10

你只需要:

cd..
start Code.bat

这将从其自己的目录中启动code.bat。


12
这不是被要求的。你想从子目录运行它可能有原因。例如,因为你需要将一些来自子目录的文件作为参数传递。 - Darida

3

尝试使用这个:

start ../code.bat

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