Dalam shell-scripting jika saya perlu menjalankan perintah dari direktori, saya dapat menggunakan subshell untuk memastikan saya kembali ke konteks aslinya:
(cd temporary/new/directory ; command)
# now I am still in original directory
Apakah ini dapat dilakukan dalam file batch Windows (atau file cmd)
Melakukan hal yang sama dalam file batch membuat saya di direktori baru.
Dapat saya lakukan:
pushd temporary\new\directory && command && popd
Tetapi popd tergantung pada keberhasilan command
.
Ada ide?
Jawaban:
Jika kamu melakukan:
Anda akan ditinggalkan (seperti yang Anda nyatakan) di folder \ windows. Mencoba:
dan Anda harus menemukan diri Anda kembali ke tempat Anda mulai.
sumber
cd
/pushd
kadang gagal (jika direktori tidak ada, misalnya).pushd \windows && (foobar & popd)
mungkin lebih dapat diandalkanSecara default, file batch Windows dijalankan dalam konteks shell induk (yang tidak biasa bagi pengguna Unix, di mana eksplisit
source
diperlukan, tetapi merupakan satu-satunya kemungkinan dalam MS-DOS). Ini berarti perubahan direktori dan variabel lingkungan juga memengaruhi shell interaktif asli.Letakkan
setlocal
di bagian atas skrip Anda untuk membuatnya berjalan dalam konteksnya sendiri - Anda dapat menggunakancd
skrip dengan aman .sumber
(
)
hanya perintah grup bersama, tetapi masih menjalankannya dalam konteks induk.(setlocal & cd foo & bar)
tidak akan bekerja; sebaliknyapushd foo && (bar & popd)
akan dibutuhkan.Seperti grawity yang disebutkan sebelumnya,
pushd \windows && (foobar & popd)
akan bekerja lebih baik daripadapushd \windows & foobar & popd
karena yang terakhir mungkin gagal jika tidak ada direktori seperti itu.Selain itu, menggunakan
setlocal
danendlocal
memungkinkan Anda memiliki beberapa lingkungan lokal, jadi misalnya Anda dapat memiliki:setlocal
cd dir
command
endlocal
Sekarang Anda akan kembali ke direktori asli Anda.
sumber
Anda dapat menggunakan
cd -
untuk kembali ke direktori kerja sebelumnya. Dan gunakan;
alih-alih&&
, maka perintah selanjutnya tidak akan bergantung pada keberhasilan perintah sebelumnya.sumber
Saya memuji saran grawity untuk menempatkan
setlocal
di awal skrip batch Anda, tetapi saya akan menambahkan fakta bahwa Anda dapat memiliki beberapa, bersarang,setlocal
/endlocal
blok, sehingga jawaban yang lebih relevan untuk pertanyaan itu mungkinDan, tentu saja, jika Anda ingin perintah dieksekusi hanya jika
cd
todir2
berhasil, katakan .cd
dir2
&&
command
Perhatikan bahwa
setlocal
/endlocal
blok menciptakan lingkungan terlokalisasi, sehingga variabel apa pun yang Anda atur atau ubah pada blok tersebut akan kembali ke nilai sebelumnya setelahendlocal
.sumber
Anda dapat menyimpan direktori saat ini menjadi variabel. Ubah dan ubah kembali tergantung pada nilai balik dari perintah. BTW,% CD% mengembalikan DIR Anda saat ini.
sumber