Apa arti% ~ dp0, dan bagaimana cara kerjanya?

1024

Saya merasa %~dp0sangat berguna, dan saya sering menggunakannya untuk membuat file batch saya lebih portabel.

Tetapi label itu sendiri tampak sangat samar bagi saya ... Apa yang ~dilakukan? Apakah dpmaksud drive dan path? Apakah 0merujuk ke %0, path ke file batch yang menyertakan nama file?

Atau itu hanya label aneh?

Saya juga ingin tahu apakah itu fitur yang terdokumentasi, atau sesuatu yang cenderung ditinggalkan.

Sebastián Grignoli
sumber
13
kemungkinan duplikat Apa artinya% ~ d0 dalam file batch Windows?
Helen
2
Anda benar, Hellen. Pertanyaan itu tidak muncul ketika saya mencari% ~ dp0. Mungkin karena ia memiliki% ~ d0 pada judulnya, bukan% ~ dp0.
Sebastián Grignoli
9
SymbolHound sangat bagus untuk melakukan pencarian selain karakter alfanumerik. Misalnya, cari%~dp0 . Biasanya saya menemukan bahwa hits teratas merujuk pada konten di SO.
DavidRR
SymbolHound tidak berfungsi untuk saya dengan pencarian symbolhound.com/?q=%25 ~ dp0 . Namun ini berhasil: google.com/search?q=%25 ~ dp0 - katakan saja ...
Kristopher
1
SymbolHound 2019: Tidak berfungsi dan uMatrix menunjukkan bahwa ia terhubung ke situs pihak ketiga seperti blockchain.info dan paypalobjects.com.
Nils Lindemann

Jawaban:

811

Panggilan

for /?

di baris perintah memberikan bantuan tentang sintaks ini (yang dapat digunakan di luar FOR, juga, ini hanya tempat di mana bantuan dapat ditemukan).

Selain itu, substitusi referensi variabel FOR telah ditingkatkan. Anda sekarang dapat menggunakan sintaks opsional berikut:

%~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

Pengubah dapat digabungkan untuk mendapatkan hasil majemuk:

%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
               environment variable for %I and expands to the
               drive letter and path of the first one found.
%~ftzaI     - expands %I to a DIR like output line

Dalam contoh di atas% I dan PATH dapat diganti dengan nilai-nilai valid lainnya. Sintaks% ~ diakhiri oleh nama variabel FOR yang valid. Memilih nama variabel huruf besar seperti% I membuatnya lebih mudah dibaca dan menghindari kebingungan dengan pengubah, yang tidak peka huruf besar-kecil.

Ada beberapa huruf yang dapat Anda gunakan seperti funtuk "nama path lengkap", duntuk huruf drive, puntuk path, dan mereka dapat digabungkan. %~adalah awal untuk masing-masing sekuens dan angka Imenunjukkan itu berfungsi pada parameter %I(di mana %0nama lengkap file batch, seperti yang Anda asumsikan).

schnaader
sumber
2
Saya tidak tahu tentang orang lain, tetapi saya mendapatkan "Penggunaan operator jalur berikut ini dalam substitusi parameter-batch tidak valid. Untuk format yang valid ketik CALL /? Atau FOR / ?. Sintaks perintahnya salah." saat menggunakan I. Saya harus menggunakan 0sebagai gantinya I. Saya tidak tahu apakah saya melewatkan sesuatu atau apa pun, tetapi hanya membiarkan orang tahu.
mythofechelon
71
@ BenHooper, Iadalah penampung untuk indeks variabel. 0= file panggilan, 1= argumen # 1, 2= argumen # 2, dll ...
Chris
9
Jawaban ini bagus. Dan lengkap. Untuk sedikit lebih singkat, saya suka jawaban untuk pertanyaan hampir-duplikat ini: stackoverflow.com/questions/112055/…
Frank Nocke
1
Jawaban ini sedikit membingungkan karena pergantian ini dapat digunakan di luar FOR.
David
348

(Pertama, saya ingin merekomendasikan situs referensi yang berguna ini untuk batch: http://ss64.com/nt/ )

Kemudian hanyalah penjelasan bermanfaat lainnya: http://htipe.wordpress.com/2008/10/09/the-dp0-variable/

% ~ Dp0 Variabel

% The ~ dp0 (itu nol) variabel ketika direferensikan dalam file batch Windows akan memperluas ke d surat rive dan p ath dari file batch.

Variabel% 0-% 9 merujuk pada parameter baris perintah file batch. % 1-% 9 merujuk pada argumen baris perintah setelah nama file batch. % 0 merujuk pada file kumpulan itu sendiri.

Jika Anda mengikuti karakter persen (%) dengan karakter tilde (~), Anda dapat memasukkan pengubah sebelum nomor parameter untuk mengubah cara variabel diperluas. Pengubah d memperluas ke huruf pengandar dan pengubah p memperluas ke jalur parameter.

Contoh: Misalkan Anda memiliki direktori pada C: bernama bat_files, dan dalam direktori itu adalah file bernama example.bat. Dalam kasus ini,% ~ dp0 (menggabungkan pengubah d dan p) akan diperluas ke C: \ bat_files.

Lihat artikel Microsoft ini untuk penjelasan lengkap.

Juga, periksa utas forum ini .

Dan referensi yang lebih jelas dari sini :

  • %CmdCmdLine% akan mengembalikan seluruh baris perintah sebagaimana diteruskan ke CMD.EXE

  • %* akan mengembalikan sisa baris perintah mulai dari argumen baris perintah pertama (di Windows NT 4,% * juga termasuk semua spasi utama)

  • %~dn akan mengembalikan huruf drive% n (n dapat berkisar dari 0 hingga 9) jika% n adalah jalur atau nama file yang valid (tidak ada UNC)

  • %~pn akan mengembalikan direktori% n jika% n adalah jalur atau nama file yang valid (tidak ada UNC)

  • %~nn akan mengembalikan nama file hanya dari% n jika% n adalah nama file yang valid

  • %~xn akan mengembalikan ekstensi file hanya dari% n jika% n adalah nama file yang valid

  • %~fn akan mengembalikan jalur terkualifikasi penuh dari% n jika% n adalah nama file atau direktori yang valid

TAMBAH 1

Baru saja menemukan beberapa referensi bagus untuk operator tilde misterius ~ .

The %~string disebut persen tilde operator. Anda dapat menemukannya dalam situasi seperti: %~0.

The :~string disebut usus tilde operator. Anda dapat menemukannya seperti %SOME_VAR:~0,-1%.

ADD 2 - 1:12 PM 7/6/2018

%1-%9lihat args baris perintah. Jika tidak nilai jalur yang valid, %~dp1- %~dp9semua akan diperluas ke nilai yang sama dengan %~dp0. Tetapi jika mereka adalah nilai-nilai jalan yang valid, mereka akan memperluas untuk mereka sendiri value driver / jalur.

Sebagai contoh: (batch.bat)

@echo off
@echo ~dp0= %~dp0
@echo ~dp1= %~dp1
@echo ~dp2= %~dp2
@echo on

Jalankan 1:

D:\Workbench>batch arg1 arg2

~dp0= D:\Workbench\
~dp1= D:\Workbench\
~dp2= D:\Workbench\

Jalankan 2:

D:\Workbench>batch c:\123\a.exe e:\abc\b.exe

~dp0= D:\Workbench\
~dp1= c:\123\
~dp2= e:\abc\
smwikipedia
sumber
Juga ingin tahu tentang konsep ini dan menemukan klarifikasi yang baik di sini. Makasih mingge ^ _ ^
Eugene
1
bagi saya itu mengembang ke c: \ bat_files \ (dengan trailing path seperator)
santa
Tautan ke artikel Microsoft dan utas forum tidak berfungsi lagi :(
wovano
151

Variabel %0dalam skrip batch diatur ke nama file batch yang dieksekusi.

The ~dpsintaks khusus antara %dan 0pada dasarnya mengatakan untuk memperluas variabel %0untuk menunjukkan huruf drive dan path, yang memberikan Anda direktori saat ini yang berisi file batch!

Bantuan = Tautan

Andy White
sumber
@Andy, Apakah ada cara untuk menguji %0langsung di cmd tanpa menyimpan file .bat ke harddisk lokal?
Pacerier
Tautan terputus, dan saya tidak dapat menemukan tautan yang benar. Hasil edit yang tertunda masih memiliki tautan yang terputus.
George_E
44

% ~ dp0 memperluas ke jalur direktori saat ini dari file batch yang berjalan.

Untuk mendapatkan pemahaman yang jelas, mari kita buat file batch dalam direktori.

C: \ script \ test.bat

dengan konten:

@echo off
echo %~dp0

Ketika Anda menjalankannya dari command prompt, Anda akan melihat hasil ini:

C: \ script \

batal
sumber
41

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

Atau, untuk #oneLinerLovers, seperti yang ditunjukkan @Omni di komentar cd /d %~dp0akan mengubah drive dan direktori :)

Semoga ini bisa membantu seseorang.

Marvin Thobejane
sumber
23
cdmemiliki parameter bawaan yang akan mengganti drive dan folder:cd /d %~dp0
OmnipotentEntity
2
Anda benar dan /dargumennya bermanfaat, tetapi layak untuk diposting sebagai kandidat jawaban alternatif dan bukan komentar untuk yang satu ini. Terima kasih telah menunjukkan ini, saya tidak tahu tentang hal itu :)
Marvin Thobejane
4
Anda juga dapat menggunakan '' pushd% ~ dp0 '' untuk berpindah drive dan folder
fmuecke
25

Contoh bagus dari peluncur shell portabel Strawberry Perl:

set drive=%~dp0
set drivep=%drive%
if #%drive:~-1%# == #\# set drivep=%drive:~0,-1%

set PATH=%drivep%\perl\site\bin;%drivep%\perl\bin;%drivep%\c\bin;%PATH%

tidak yakin apa yang dilakukan 1 negatif di sana sendiri, tetapi itu berhasil memperlakukan!

HansBKK
sumber
11
+1 sangat bermanfaat. Pernyataan if memeriksa apakah backslash ada dan menghapus backslash jika perlu. Negatif 1 dalam kondisi mengekstraksi karakter terakhir, dan ekspresi dalam pernyataan set mengambil string path minus karakter terakhir (yang merupakan garis miring terbalik).
Matt
1
negatif 1 minus karakter terakhir. Baca substring variabel
phuclv
12

Sebuah contoh akan menyenangkan - inilah contoh yang sepele

for %I in (*.*) do @echo %~xI

itu hanya mencantumkan PERLUASAN setiap file dalam folder saat ini

untuk kombinasi variabel yang lebih bermanfaat (juga tercantum dalam respons sebelumnya) dari eksekusi prompt CMD: HELP FOR yang berisi potongan ini

Pengubah dapat digabungkan untuk mendapatkan hasil majemuk:

%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
               environment variable for %I and expands to the
               drive letter and path of the first one found.
%~ftzaI     - expands %I to a DIR like output line
admin
sumber
aku mendapat "~ xAku tak terduga saat ini." mencoba contoh - apakah karena saya menggunakan Win 7?
bab3
Ini adalah informasi yang baik, tetapi gagal untuk mengatasi pos asli.
De Shan Baptiste