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

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

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

(cd temporary/new/directory ; command)
# now I am still in original directory

可以在 Windows 批处理文件(或 cmd 文件)中完成此操作吗?

在批处理文件中执行相同操作会使我进入新目录。

我可以:

pushd temporary\new\directory && command && popd

但 popd 依赖于 的成功command

有任何想法吗?

答案1

如果你这样做:

pushd \windows && foobar && popd

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

pushd \windows & foobar & popd

你会发现自己又回到了原点。

答案2

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

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

答案3

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

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

setlocal

cd dir

command

endlocal

现在您将回到原来的目录。

答案4

我赞同 grawity 的建议,将其放在setlocal批处理脚本的开头,但我想补充一点,你可以有多个嵌套的setlocal/endlocal块,因此对这个问题更相关的答案可能是

@echo off
setlocal
cddir1
  ...
setlocal
cddir2
command
endlocal
:: Now I am back indir1
  ...

当然,如果你希望命令仅cddir2成功了,说cddir2&&command

请注意,setlocal/endlocal块会创建本地化环境,因此在这样的块中设置或更改的任何变量都将在 之后恢复为先前的值endlocal

相关内容