Dapatkan direktori batchfile saat ini

283

Pertama, saya melihat topik ini tetapi saya tidak mengerti.

Pertanyaan :

Ada file batch D:\path\to\file.batdengan konten berikut:

echo %cd%
pause

Output adalah:

C:\

Pasti begitu D:\path\to

Apa yang saya lakukan salah?

Hamed Kamrava
sumber
7
Anda harus membaca semua jawaban untuk sebuah pertanyaan, terutama para pengambil suara yang lebih tinggi, bukan hanya yang diterima. Jawaban dengan skor tertinggi di tautan yang diposting sudah menjawab pertanyaan Anda.
dbenham
4
Jika Anda berada di c: \ ketika Anda mengetik nama file batch maka c: \ adalah apa yang% cd% akan dicetak.
foxidrive

Jawaban:

497

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 %~dp0akan mengembalikan Drive dan Path ke skrip batch (misalnya W:\scripts\) dan %~f0akan 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.

Lebih lanjut tentang parameter batch .

Stoleg
sumber
1
Dengar, aku tidak perlu stm.sqlmasuk D:\Dir1\Dir2\stm.sql. Saya perlu mysql.exe -u root -p mysql < %cd%\stm.sqlmenjalankan perintah stm.sql.
Hamed Kamrava
@HamedKamrava apakah ini untuk batch SQL saya? bukan file batch suka *.batatau *.sh?
Stoleg
@ Stoleg- Bahkan, Ada 2 file dalam D:\Dir1\Dir2\batchfile.batdan D:\Dir1\Dir2\stm.sql. konten batchfile.bat adalah: mysql.exe -u root -p mysql < D:\Dir1\Dir2\stm.sqldan konten stm.sql adalah beberapa perintah MySQL.
Hamed Kamrava
1
Variabel read-only sistem% CD% menyimpan jalur pemanggil batch, bukan lokasi file batch.
Stoleg
35
echo %~dp0akan mengembalikan jalur ke lokasi batch. echo %~f0akan mengembalikan path ke batch dengan nama file.
Stoleg
119

Sangat sederhana:

setlocal
cd /d %~dp0
File.exe
shay
sumber
9
Kode ini pendek tetapi tidak mudah dimengerti. Apa File.exe ini? Apakah jalur direktori saat ini disimpan di% ~ dp0?
Ivailo Bardarov
Jawaban ini sebenarnya menjawab pertanyaan, saya pikir. Pujian.
macetw
3
Saya hanya digunakan cd /d %~dp0sebagai baris pertama file batch dan bekerja
mkb
mengapa perlu setlocal? kembali dengan baik tanpa itu juga?
T.Todua
1
@ T.Todua "setlocal" menyebabkan perubahan lingkungan, termasuk direktori saat ini yang akan terkandung baik sampai file batch berakhir atau "endlocal" ditemukan. Jika Anda akan mengubah variabel lingkungan atau direktori saat ini, itu adalah bentuk yang baik.
Jamie
30

Dalam file .bat Anda:

set mypath=%cd%

Anda sekarang dapat menggunakan variabel %mypath%untuk referensi path file ke .batfile. Untuk memverifikasi jalur sudah benar:

@echo %mypath%

Misalnya, file dipanggil DIR.batdengan konten berikut

set mypath=%cd%
@echo %mypath%
Pause

menjalankan dari direktori g:\test\batakan mengulangi jalur itu di jendela perintah DOS.

rockerron
sumber
1
ini adalah solusi terbaik dan paling sederhana
Nani
7
Ini bukan solusi yang baik karena tidak memperhitungkan skrip batch yang dipanggil dari file lain di jalur lain.
theQuestionMan
juga ketika dijalankan sebagai izin yang ditinggikan,% cd% mengembalikan C: \ Windows \ system32 tetapi bukan direktori tempat penyimpanannya.
PravyNandas
9

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.

Wendell Holmes
sumber
2
Jawaban yang bagus, terima kasih banyak! :-) Hati-hati dengan teknik kedua Anda ( 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.
Mitch McMabers