保留在 BATCH 文件中的当前工作目录中

保留在 BATCH 文件中的当前工作目录中

我有一个根目录,从中运行主批处理文件,它调用根目录子目录中的另一个批处理文件(第二个批处理文件)。

执行第二批处理文件后,想要保留在根目录中:

@echo off 
set root_dir=C:\Users\milan\Desktop 

cd "%root_dir%\2nd_dir"
call 2nd_batch.bat

echo %cd%

最后的 echo 命令应该向我显示根目录的补丁。我尝试这样做

cd "\%root_dir%\2nd_dir\"

但它没有起作用。

答案1

您面临的问题在于调用指令的工作方式。

当您在批处理文件中使用调用指令时,它会将该批处理文件包含到当前脚本中并运行其代码。这意味着新脚本对您的环境所做的所有更改都会延续到上一个批处理文件中,正如您所注意到的。

您可以使用 start 命令而不是 call 命令在新的进程中启动新的批处理文件,这样就不会将其更改转移到前一个批处理文件中。

或者,您可以在执行新脚本之前存储当前文件夹,并在脚本完成后返回该文件夹。

下面是 2 个示例。:: 行是注释。您可以将其复制到脚本中,也可以根据需要将其省略。

:: example that uses start
cd "%root_dir%\2nd_dir"
start 2nd_batch.bat

echo %cd%

:: example that stores and sets the path

:: store current folder for retrieval
set masterfolder=%cd%
cd "%root_dir%\2nd_dir"
call 2nd_batch.bat

:: restore folder
cd /d %masterfolder%

echo %cd%

答案2

使用setlocal来保存当前设置(当前驱动器、文件夹、环境等),并endlocal使用来恢复它们。

[测试1.bat]

@echo off
setlocal
echo test1-1 : %cd%
call test2.bat
echo test1-2 : %cd%
endlocal
echo test1-3 : %cd%

[测试2.bat]

echo test2-1 : %cd%
cd \
echo test2-2: %cd%

在此处输入图片描述

PS. setlocal/endlocal 可以嵌套。

答案3

打开cmd.exe并执行以下查询。

PUSHD/?
POPD/?

问题解决了。

通过对使用帮助查询时列出的命令进行查询可以找到很多答案/?

PUSHD 允许您以类似于 CD 的方式更改目录,因此:

PUSHD "DirectoryPath"

但是,PUSHD 存储了前一个目录以供 POPD 调用。

因此,在您描述的情况下,您将 PUSHD 到其他批处理文件使用或需要的目录,然后当您需要返回上一个目录时,只需使用

POPD

瞧,你就到了。

要使用 PUSHD/POPD 解决此问题:

在您的主批处理文件中:

PUSHD "PathFor2ndBatch"
call 2nd_batch.bat
POPD
echo %cd%

如果目的是让第二个批处理文件在主批处理文件的目录中执行:

PUSHD "PathFor2ndBatch"
CALL 2nd_Batch.bat

在第二批开始时:

POPD

答案4

您还可以使用 /D 开关启动批处理文件:

start /?
START [/D path]
path        Starting directory

因此,运行下面的代码将使批处理文件在C:\users目录内运行。

start /D C:\users C:\Windows\System32\RCWM\rmdir.bat

但是,就像 Akina 在评论中提到的那样,start /w对于这个目的来说,它更短。

相关内容