Pertama, saya melihat topik ini tetapi saya tidak mengerti.
Pertanyaan :
Ada file batch D:\path\to\file.bat
dengan konten berikut:
echo %cd%
pause
Output adalah:
C:\
Pasti begitu D:\path\to
Apa yang saya lakukan salah?
Pertama, saya melihat topik ini tetapi saya tidak mengerti.
Pertanyaan :
Ada file batch D:\path\to\file.bat
dengan konten berikut:
echo %cd%
pause
Output adalah:
C:\
Pasti begitu D:\path\to
Apa yang saya lakukan salah?
Jawaban:
Variabel read-only %CD%
sistem menjaga jalur pemanggil batch, bukan lokasi file batch.
Anda bisa mendapatkan nama skrip kumpulan itu sendiri seperti yang diketik oleh pengguna dengan %0
(mis scripts\mybatch.bat
.). Ekstensi parameter dapat diterapkan untuk ini sehingga %~dp0
akan mengembalikan Drive dan Path ke skrip batch (misalnya W:\scripts\
) dan %~f0
akan mengembalikan nama path lengkap (misalnya W:\scripts\mybatch.cmd
).
Anda bisa merujuk ke file lain di folder yang sama dengan skrip batch dengan menggunakan sintaks ini:
CALL %0\..\SecondBatch.cmd
Ini bahkan dapat digunakan dalam subrutin, Echo %0
akan memberikan label panggilan tetapi, echo "%~nx0"
akan memberi Anda nama file skrip batch.
Ketika %0
variabel diperluas, hasilnya dilampirkan dalam tanda kutip.
stm.sql
masuk D:\Dir1\Dir2\stm.sql
. Saya perlu mysql.exe -u root -p mysql < %cd%\stm.sql
menjalankan perintah stm.sql.
*.bat
atau *.sh
?
D:\Dir1\Dir2\batchfile.bat
dan D:\Dir1\Dir2\stm.sql
. konten batchfile.bat adalah: mysql.exe -u root -p mysql < D:\Dir1\Dir2\stm.sql
dan konten stm.sql adalah beberapa perintah MySQL.
echo %~dp0
akan mengembalikan jalur ke lokasi batch. echo %~f0
akan mengembalikan path ke batch dengan nama file.
Sangat sederhana:
setlocal
cd /d %~dp0
File.exe
cd /d %~dp0
sebagai baris pertama file batch dan bekerja
Dalam file .bat Anda:
set mypath=%cd%
Anda sekarang dapat menggunakan variabel %mypath%
untuk referensi path file ke .bat
file. Untuk memverifikasi jalur sudah benar:
@echo %mypath%
Misalnya, file dipanggil DIR.bat
dengan konten berikut
set mypath=%cd%
@echo %mypath%
Pause
menjalankan dari direktori g:\test\bat
akan mengulangi jalur itu di jendela perintah DOS.
Inilah yang saya gunakan di bagian atas semua file batch saya. Saya baru saja menyalin / menempel dari folder template saya.
@echo off
:: --HAS ENDING BACKSLASH
set batdir=%~dp0
:: --MISSING ENDING BACKSLASH
:: set batdir=%CD%
pushd "%batdir%"
Mengatur path file batch saat ini ke% batdir% memungkinkan Anda untuk memanggilnya di stmts berikutnya dalam file batch saat ini, terlepas dari mana perubahan file batch ini. Menggunakan PUSHD memungkinkan Anda menggunakan POPD untuk dengan cepat mengatur lintasan file batch ini ke% batdir% asli. Ingat, jika menggunakan% batdir% ExtraDir atau% batdir% \ ExtraDir (tergantung pada versi mana yang digunakan di atas, mengakhiri garis miring terbalik atau tidak) Anda harus menyertakan seluruh string dalam tanda kutip ganda jika path memiliki spasi (yaitu "% batdir% ExtraDir" ). Anda selalu dapat menggunakan PUSHD% ~ dp0. [https: // ss64.com/ nt / syntax-args .html] memiliki lebih banyak parameter (% ~).
Perhatikan bahwa menggunakan (: :) di awal baris membuatnya menjadi baris komentar. Lebih penting lagi, menggunakan :: memungkinkan Anda untuk memasukkan pengalih, pipa, karakter khusus (yaitu <> | dll) dalam komentar itu.
:: ORIG STMT WAS: dir *.* | find /v "1917" > outfile.txt
Tentu saja, Powershell melakukan ini dan banyak lagi.
set batdir=%CD%
). Itu tidak apa-apa, karena itu adalah jalan ke pemanggil, bukan file bat itu sendiri. Satu-satunya cara yang valid untuk mendapatkan path ke file bat yang sedang dieksekusi adalah %~dp0
.