在 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
因為如果沒有這樣的目錄,後者可能會失敗。
此外,使用setlocal
andendlocal
允許您擁有多個本地環境,例如您可以擁有:
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
.