临时更改单个批处理文件命令的目录

Gre*_*reg 25 windows batch-file working-directory

在 shell 脚本中,如果我需要从目录运行命令,我可以使用子 shell 来确保我返回到原始上下文:

(cd temporary/new/directory ; command)
# now I am still in original directory
Run Code Online (Sandbox Code Playgroud)

这可以在 Windows 批处理文件(或 cmd 文件)中完成吗

在批处理文件中做同样的事情会让我留在新目录中。

我可以:

pushd temporary\new\directory && command && popd
Run Code Online (Sandbox Code Playgroud)

但是 popd 依赖于command.

有任何想法吗?

Bil*_*3rd 22

如果你这样做:

pushd \windows && foobar && popd
Run Code Online (Sandbox Code Playgroud)

您将被留在 \windows 文件夹中(如您所述)。尝试:

pushd \windows & foobar & popd
Run Code Online (Sandbox Code Playgroud)

你应该会发现自己回到了起点。

  • 最好记住 `cd`/`pushd` 有时会失败(例如,如果目录不存在)。`pushd \windows && (foobar & popd)` 可能更可靠 (6认同)

use*_*686 20

默认情况下,Windows 批处理文件在父 shell 的上下文中运行(这对于source需要显式的 Unix 用户来说是不寻常的,但在 MS-DOS 中是唯一的可能性)。这意味着目录更改和环境变量也会影响原始交互式 shell。

放在setlocal脚本的顶部以使其在自己的上下文中运行 - 然后您可以安全地cd在脚本内部使用。


小智 6

正如前面提到的,如果没有这样的目录,后者可能会失败,所以pushd \windows && (foobar & popd)效果会更好pushd \windows & foobar & popd

此外,使用setlocalendlocal允许您拥有多个本地环境,例如您可以拥有:

setlocal

cd dir

command

endlocal

现在您将回到原始目录。