在 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
因为如果没有这样的目录,后者可能会失败。
此外,使用setlocal
和endlocal
允许您拥有多个本地环境,例如您可以拥有:
setlocal
cd dir
command
endlocal
现在您将回到原来的目录。
答案4
我赞同 grawity 的建议,将其放在setlocal
批处理脚本的开头,但我想补充一点,你可以有多个嵌套的setlocal
/endlocal
块,因此对这个问题更相关的答案可能是
@echo off
setlocal
cd
dir1
...
setlocal
cd
dir2
command
endlocal
:: Now I am back in
dir1
...
当然,如果你希望命令仅cd
在dir2
成功了,说cd
dir2
&&
command
。
请注意,setlocal
/endlocal
块会创建本地化环境,因此在这样的块中设置或更改的任何变量都将在 之后恢复为先前的值endlocal
。