Apa arti% ~ d0 dalam file batch Windows?

355

Saya sedang melihat file batch yang mendefinisikan variabel-variabel berikut:

set _SCRIPT_DRIVE=%~d0
set _SCRIPT_PATH=%~p0
  • Apa maksud %~d0atau %~p0sebenarnya?
  • Apakah ada satu set nilai terkenal untuk hal-hal seperti direktori saat ini, drive, parameter ke skrip?
  • Apakah ada cara pintas serupa yang bisa saya gunakan?
Chris Smith
sumber

Jawaban:

541

Variabel ajaib %n berisi argumen yang digunakan untuk memanggil file: %0adalah path ke file bat itu sendiri, %1adalah argumen pertama setelah, %2adalah yang kedua dan seterusnya.

Karena argumen sering path file, ada beberapa sintaks tambahan untuk mengekstrak bagian dari path. ~dadalah drive, ~padalah path (tanpa drive), ~nadalah nama file. Mereka dapat digabungkan jadi ~dpdrive + path.

%~dp0 Oleh karena itu cukup berguna dalam kelelawar: itu adalah folder di mana file kelelawar pelaksana berada.

Anda juga bisa mendapatkan meta info jenis lain tentang file: ~tis the timestamp, ~zis the size.

Lihat di sini untuk referensi untuk semua perintah baris perintah. Kode tilde-magic dijelaskan untuk .

JacquesB
sumber
15
note to self: echo %~dp0tidak akan bekerja di command line, hanya di file batch. Duh!
northben
2
apakah ada perbedaan antara %~d0dan %~d0%?
Geoffrey
2
@Pacerier:% 0 adalah path lengkap termasuk nama file skrip. % ~ dp0 adalah path ke folder yang berisi skrip tetapi tidak termasuk nama file skrip.
JacquesB
4
note to self: echo %~pd0memberikan output yang sama dengan echo %~dp0(bukannya terbalik seperti yang diharapkan). Juga, nilai %0adalah berbeda tergantung pada apakah Anda klik dua kali file batch atau menjalankannya dari cmd.
Pacerier
152

Mereka adalah substitusi variabel yang ditingkatkan. Mereka memodifikasi variabel% N yang digunakan dalam file batch. Cukup berguna jika Anda suka pemrograman batch di Windows.

%~I         - expands %I removing any surrounding quotes ("")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file
%~$PATH:I   - searches the directories listed in the PATH
               environment variable and expands %I to the
               fully qualified name of the first one found.
               If the environment variable name is not
               defined or the file is not found by the
               search, then this modifier expands to the
               empty string

Anda dapat menemukan hal di atas dengan menjalankan FOR /?.

efotinis
sumber
48

Ya, Ada cara pintas lain yang dapat Anda gunakan yang diberikan di bawah ini. Dalam perintah Anda, ~ d0 berarti huruf drive dari argumen 0.

~ expands the given variable
d gets the drive letter only
0 is the argument you are referencing

Karena argumen 0 adalah jalur skrip, ia mendapatkan huruf drive untuk Anda. Anda dapat menggunakan pintasan berikut juga.

%~1         - expands %1 removing any surrounding quotes (")
%~f1        - expands %1 to a fully qualified path name
%~d1        - expands %1 to a drive letter only
%~p1        - expands %1 to a path only
%~n1        - expands %1 to a file name only
%~x1        - expands %1 to a file extension only
%~s1        - expanded path contains short names only
%~a1        - expands %1 to file attributes
%~t1        - expands %1 to date/time of file
%~z1        - expands %1 to size of file
%~$PATH:1   - searches the directories listed in the PATH
               environment variable and expands %1 to the fully
               qualified name of the first one found.  If the
               environment variable name is not defined or the
               file is not found by the search, then this
               modifier expands to the empty string    

%~dp1       - expands %1 to a drive letter and path only
%~nx1       - expands %1 to a file name and extension only
%~dp$PATH:1 - searches the directories listed in the PATH
               environment variable for %1 and expands to the
               drive letter and path of the first one found.
%~ftza1     - expands %1 to a DIR like output line

Ini juga dapat ditemukan langsung di command prompt ketika Anda menjalankan CALL /? atau untuk /?

Clewaks
sumber
9

Tip lain yang akan banyak membantu adalah mengatur direktori saat ini ke drive lain yang harus digunakan %~d0terlebih dahulucd %~dp0 . Ini akan mengubah direktori ke drive file batch, kemudian mengubah ke foldernya.

Untuk #oneLinerLovers, cd /d %~dp0 akan mengubah drive dan direktori :)

Semoga ini bisa membantu seseorang.

Marvin Thobejane
sumber
7
Pilihan lain adalah pushd %~dp0, yang tidak memiliki masalah mengubah drive saat ini, dan memberi Anda bonus tambahan untuk dapat popdkembali ke drive / path asli nanti.
bcrist
7

%~d0memberi Anda huruf drive argumen 0 (nama skrip), %~p0path.

Armin Ronacher
sumber
6

Beberapa gotcha yang harus diperhatikan:

Jika Anda mengklik dua kali file batch %0akan dikelilingi oleh tanda kutip. Misalnya, jika Anda menyimpan file ini sebagai c:\test.bat:

@echo %0
@pause

Mengklik dua kali akan membuka prompt perintah baru dengan output:

"C:\test.bat"

Tetapi jika Anda pertama kali membuka prompt perintah dan memanggilnya langsung dari prompt perintah itu, %0akan merujuk pada apa pun yang Anda ketikkan . Jika Anda mengetik test.batEnter, output dari %0tidak memiliki tanda kutip karena Anda mengetikkan tanda kutip:

c:\>test.bat
test.bat

Jika Anda mengetik testEnter, output dari tidak %0akan memiliki ekstensi juga, karena Anda mengetikkan tidak ada ekstensi:

c:\>test
test

Sama untuk tEsTEnter:

c:\>tEsT
tEsT

Jika Anda mengetik "test"Enter, output dari %0akan memiliki tanda kutip (karena Anda mengetiknya) tetapi tidak ada ekstensi:

c:\>"test"
"test"

Terakhir, jika Anda mengetik "C:\test.bat", hasilnya akan persis seolah-olah Anda telah mengklik dua kali:

c:\>"C:\test.bat"
"C:\test.bat"

Perhatikan bahwa ini tidak semua nilai yang dimungkinkan %0karena Anda dapat memanggil skrip dari folder lain:

c:\some_folder>/../teST.bAt
/../teST.bAt

Semua contoh yang ditunjukkan di atas juga akan mempengaruhi %~0, karena output %~0hanyalah output dari %0 tanda kutip minus (jika ada).

Pacerier
sumber
3

Kode ini menjelaskan penggunaan karakter ~ tilda, yang merupakan hal yang paling membingungkan bagi saya. Setelah saya memahami ini, itu membuat banyak hal lebih mudah untuk dipahami:

@ECHO off
SET "PATH=%~dp0;%PATH%"
ECHO %PATH%
ECHO.
CALL :testargs "these are days" "when the brave endure"
GOTO :pauseit
:testargs
SET ARGS=%~1;%~2;%1;%2
ECHO %ARGS%
ECHO.
exit /B 0
:pauseit
pause
Djangofan
sumber
1

Ini menampilkan lokasi file atau direktori saat ini tempat Anda berada. Misalnya; jika file batch Anda ada di direktori desktop, maka "% ~ dp0" akan menampilkan direktori desktop. jika Anda ingin menampilkan direktori saat ini dengan nama file saat ini Anda dapat mengetik "% ~ dp0% ~ n0% ~ x0".

zask
sumber
"% ~ dpnx0" akan lebih baik
FrinkTheBrave