如何调用当前目录中一级的批处理文件?

Jas*_*ore 12 batch-file call

我正在使用批处理文件 folder1/folder2/file.bat

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

我尝试过使用:

start ..\..\code.bat
Run Code Online (Sandbox Code Playgroud)

但是这会导致错误消息,因为找不到文件.

有任何想法吗?

Mof*_*ofi 18

我想更好地解释一下应该用于示例的内容,因为到目前为止发布的答案仅适用于当前工作目录是包含批处理文件的目录file.bat.

有一个目录结构如下:

  • C:\
    • 温度
      • 文件夹1
        • 文件夹2
          • Example.bat
        • Parent.bat

当前工作目录是C:\ Temp执行时Example.bat使用

"Folder 1\Folder 2\Example.bat"
Run Code Online (Sandbox Code Playgroud)

或者

"C:\Temp\Folder 1\Folder 2\Example.bat"
Run Code Online (Sandbox Code Playgroud)

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

echo %0 is active.
pause
Run Code Online (Sandbox Code Playgroud)

批处理文件Example.bat已包含:

@echo off
echo Calling Parent.bat ...
rem How to run Parent.bat here?
echo %0 is active.
pause
Run Code Online (Sandbox Code Playgroud)

在这种情况下,当前工作目录与包含目录的目录不同的实际解决方案Example.bat如下所示.


使用Parent.bat继续批处理

"%~dp0..\Parent.bat"
Run Code Online (Sandbox Code Playgroud)

%0 在执行批处理文件时引用参数0,该文件始终是在启动批处理文件时在父进程中指定的批处理文件的名称.

但是想要的是没有双引号的批处理文件的驱动器和路径.因此,表达式%~dp0用于从参数0 获取C:\ Temp\Folder 1\Folder 2 \.

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

完成Example.bat处理后没有返回Parent.bat.


像子程序一样调用Parent.bat

call "%~dp0..\Parent.bat"
Run Code Online (Sandbox Code Playgroud)

命令调用导致在Parent.bat同一命令进程(控制台窗口)中执行批处理文件,暂停执行Example.bat直到Parent.bat完成.

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

例外:
Parent.bat包含exit没有开关的命令,/B因为这会立即退出命令行解释器cmd.exe处理Example.batParent.bat.

执行call /?help call在命令提示符窗口中获取命令调用的简短帮助.


以并行进程启动Parent.bat

start "Parent Batch" "%~dp0..\Parent.bat"
Run Code Online (Sandbox Code Playgroud)

没有任何参数的命令启动(可选标题除外)导致在Parent.bat单独的控制台窗口中通过单独的命令进程执行批处理文件而不停止执行Example.bat.

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

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

执行start /?help start在命令提示符窗口中获取命令启动的简短帮助.


Parent.bat称为单独的进程

start "Parent Batch" /wait "%~dp0..\Parent.bat"
Run Code Online (Sandbox Code Playgroud)

命令以可选参数启动/wait导致执行启动的批处理文件/应用程序作为单独的进程(批处理文件或控制台应用程序的附加控制台窗口),但停止执行当前批处理文件直到启动进程(Windows应用程序或批处理文件)/console应用程序在新的控制台窗口中执行)终止自身.


Dou*_*leM 10

..\用来升级一级.你的情况需要两个级别尝试:

start ..\..\code.bat
Run Code Online (Sandbox Code Playgroud)

  • 在他的情况下,他只需要升一级,或者就是他问的内容,如果您读了他的帖子,那就是他尝试过的确切内容。对于bat文件,您需要使用call而不是start(至少如果您要在第二个bat文件结束后继续使用原始bat文件):因此,正确的方法是:call .. \ code.bat (2认同)

Mon*_*aft 9

你可以:

cd..
start Code.bat
Run Code Online (Sandbox Code Playgroud)

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

  • 那不是被要求的。您可能需要从子目录运行它的原因。例如,因为您需要从子目录传递一些文件作为参数。 (5认同)