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


19

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

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

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

在批处理文件中执行相同的操作会将我留在新目录中。

我可以:

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

但是popd依赖于成功command

有任何想法吗?


您如何调用“批处理文件”或“ cmd文件”?如果将cd命令放入shell脚本中并执行该脚本(而不是提供该脚本),则调用shell的当前工作目录不会更改。
garyjohn

为了清楚起见,这是指Windows批处理文件。
格雷格

它是一个脚本,它在目录树的不同部分中运行一堆命令。一些命令仅在当前目录上运行。返回原始目录有助于简化驱动脚本的数据。您是否建议为需要拨打电话的每个目录制作一个单独的批处理文件?
格雷格,

我记得您提到的是Shell脚本,而在最初的问题中没有提到Windows,因此我错误地认为您使用的是类似Unix的系统。现在我明白了。
garyjohn

是的,对不起,我知道我不清楚(尽管我认为“批处理文件”是一个提示:-p)
Greg

Answers:


21

如果您这样做:

pushd \windows && foobar && popd

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

pushd \windows & foobar & popd

并且您应该回到起点。


1
啊,所以单“&”号等于sh中的分号。那很完美。(以及参考资料:ss64.com/nt/syntax-conditional.html
Greg

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

16

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

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


谢谢,这听起来像我的需要-当我可以访问Windows计算机时,将对其进行检查。这会影响使用括号的子命令吗?
格雷格,

1
@Greg:似乎( )仅将命令组合在一起,但仍在父上下文中运行它们。(setlocal & cd foo & bar)不管用; 而是pushd foo && (bar & popd)需要。
grawity 2011年

4

如前所述,它pushd \windows && (foobar & popd)pushd \windows & foobar & popd不存在目录可能会失败,因为后者可能会失败。

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

setlocal

cd dir

command

endlocal

现在您将回到原始目录。


3

您可以cd -用来返回上一个工作目录。而使用;代替&&,则后续命令将不取决于先前命令的成功。

$ pwd
/etc
$ cd /var ; pwd ; cd -
/var
$ pwd
/etc

我已经更新了问题以澄清我在询问Windows批处理/ shell脚本。我知道如何在类似sh的外壳下进行操作:)
Greg

正如BillP3rd所指出的,等同于“;” 批处理文件中的“&”。
格雷格,

啊对不起 您使用正斜杠使我认为它是UNIX。
bahamat 2011年

1

我赞扬grawity的建议放在setlocal批处理脚本的开头,但是我要补充一个事实,您可以有多个嵌套的setlocal/ endlocal块,因此对该问题的更相关的回答可能是

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

而且,当然,如果您希望仅在cdto dir2成功的情况下才执行命令,请说。cddir2&&command

请注意,setlocal/ endlocal块创建了本地化的环境,因此您在此类块中设置或更改的任何变量都将还原为endlocal。之后的先前值。


0

您可以将当前目录保存到变量中。根据命令的返回值进行更改和更改。顺便说一句,%CD%返回您当前的DIR。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.