暫時更改單一批次檔命令的目錄

暫時更改單一批次檔命令的目錄

在 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 使用者來說是不常見的,因為source需要明確的,但這是 MS-DOS 中唯一的可能性)。這意味著目錄變更和環境變數也會影響原始互動式 shell。

放在setlocal腳本的頂部以使其在自己的上下文中運行 -cd然後您可以在腳本內部安全地使用。

答案3

正如前面提到的 gruitypushd \windows && (foobar & popd)會更好,pushd \windows & foobar & popd因為如果沒有這樣的目錄,後者可能會失敗。

此外,使用setlocalandendlocal允許您擁有多個本地環境,例如您可以擁有:

setlocal

cd dir

command

endlocal

現在您將回到原來的目錄。

答案4

我讚賞 grawity 建議將其放在setlocal批次腳本的開頭,但我想補充一下,您可以有多個嵌套的setlocal/endlocal區塊,因此對這個問題的更相關的答案可能是

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

當然,如果您希望僅在以下情況下執行該cd命令dir2成功了,說cddir2&&command

請注意,setlocal/endlocal區塊創建了一個本地化環境,因此您在此類區塊中設定或更改的任何變數都將在endlocal.

相關內容