% ~ Dp0 anlamı ne ve nasıl çalışır?


1023

%~dp0Çok kullanışlı buluyorum ve toplu iş dosyalarımı daha taşınabilir hale getirmek için çok kullanıyorum.

Ancak etiketin kendisi bana çok şifreli görünüyor ... Ne ~yapıyor? dpYol ve yol mu demek? Does 0bakın %0dosya adını içeren toplu dosya yolunu?

Yoksa sadece garip bir etiket mi?

Ayrıca, belgelenmiş bir özellik mi yoksa kullanımdan kaldırılmaya eğilimli bir şey mi olduğunu da bilmek istiyorum.



2
Haklısın, Hellen. % ~ Dp0 aradığımda bu soru ortaya çıkmadı. Belki de başlığında% ~ dp0 yerine% ~ d0 olduğu için.
Sebastián Grignoli

9
SymbolHound alfasayısal karakterler dışında arama yapmak için mükemmeldir. Örneğin, arayın%~dp0 . Genellikle en iyi hitlerin SO'daki içeriğe atıfta bulunduğunu bulurum.
DavidRR

SymbolHound, symbolhound.com/?q=%25~dp0 arama ile benim için çalışmadı . Ancak bu işe yaradı: google.com/search?q=%25~dp0 - sadece söylüyorum ...
Kristopher

1
SymbolHound 2019: Çalışmıyor ve uMatrix, blockchain.info ve paypalobjects.com gibi üçüncü taraf sitelere bağlandığını gösteriyor.
Nils Lindemann

Yanıtlar:


810

çağrı

for /?

komut satırında bu sözdizimi hakkında yardım verir (FOR dışında da kullanılabilir, burası sadece yardımın bulunabileceği yerdir).

Ek olarak, FOR değişken referanslarının ikamesi geliştirilmiştir. Artık aşağıdaki isteğe bağlı sözdizimini kullanabilirsiniz:

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

Değiştiriciler bileşik sonuçlar elde etmek için birleştirilebilir:

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

Yukarıdaki örneklerde% I ve PATH diğer geçerli değerlerle değiştirilebilir. % ~ Sözdizimi geçerli bir FOR değişken adı ile sonlandırılır. % I gibi büyük harf değişken isimlerini seçmek onu daha okunabilir hale getirir ve büyük / küçük harfe duyarlı olmayan değiştiricilerle karışıklığı önler.

f"Tam yol adı", dsürücü harfi, yol için olduğu gibi kullanabileceğiniz farklı harfler vardır pve bunlar birleştirilebilir. %~bu dizilerin her birinin başlangıcıdır ve bir sayı I, parametre üzerinde çalıştığını gösterir %I( %0varsaydığınız gibi toplu iş dosyasının tam adıdır).


2
Başka kimseyi tanımıyorum, ancak "Toplu iş parametresi ikamesinde yol operatörünün aşağıdaki kullanımı geçersiz. Geçerli biçimler için CALL /? Veya FOR /? Yazın. Komutun sözdizimi yanlış." kullanırken I. Bunun 0yerine kullanmak zorundayım I. Bir şeyleri ya da herhangi bir şeyi özledim mi bilmiyorum, ama sadece insanlara haber vermek.
mythofechelon

71
@BenHooper, Ideğişken endeksi için bir yer tutucudur. 0= çağıran dosya, 1= 1 numaralı argüman, 2= 2 numaralı argüman vb.
Chris

9
Bu cevap iyi. Ve kapsamlı. Biraz daha kısaca, bu neredeyse yinelenen sorunun cevabını seviyorum: stackoverflow.com/questions/112055/…
Frank Nocke

1
Bu cevap biraz kafa karıştırıcıdır, çünkü bu ikameler FOR dışında kullanılabilir.
David

346

(Öncelikle, toplu iş için bu yararlı referans sitesini tavsiye etmek istiyorum: http://ss64.com/nt/ )

Sonra başka bir yararlı açıklama: http://htipe.wordpress.com/2008/10/09/the-dp0-variable/

% ~ Dp0 Değişkeni

Genişleyecek Windows toplu dosya içinde başvurulan zaman% ~ dp0 değişken (yani sıfır var) d rive harfi ve p o toplu dosyasının uyugulanmasıyla.

% 0-% 9 değişkenleri, toplu iş dosyasının komut satırı parametrelerini belirtir. % 1-% 9, toplu iş dosya adından sonraki komut satırı bağımsız değişkenlerine başvurur. % 0, toplu iş dosyasının kendisini ifade eder.

Yüzde karakterini (%) tilde karakteriyle (~) izlerseniz, değişkenin genişletilme şeklini değiştirmek için parametre numarasından önce bir değiştirici (ler) ekleyebilirsiniz. D değiştirici sürücü harfine genişler ve p değiştirici parametrenin yoluna genişler.

Örnek: Diyelim ki C: üzerinde bat_files adında bir dizininiz var ve bu dizinde example.bat adlı bir dosya var. Bu durumda,% ~ dp0 (d ve p değiştiricilerini birleştirerek) C: \ bat_files değerine genişler.

Tam açıklama için bu Microsoft makalesine göz atın .

Ayrıca, bu forum başlığına göz atın .

Ve buradan daha açık bir referans :

  • %CmdCmdLine% CMD.EXE'ye iletildiği gibi tüm komut satırını döndürür

  • %* ilk komut satırı bağımsız değişkeninden başlayarak komut satırının geri kalanını döndürür (Windows NT 4'te% * da tüm önde gelen boşlukları içerir)

  • %~dn % n geçerli bir yol veya dosya adı ise (UNC yok)% n sürücü harfini döndürür (n 0 ile 9 arasında değişebilir)

  • %~pn % n geçerli bir yol veya dosya adı ise (% UNC)% n dizinini döndürür

  • %~nn % n geçerli bir dosya adı ise, yalnızca% n dosya adını döndürür

  • %~xn % n geçerli bir dosya adı ise yalnızca% n dosya uzantısını döndürür

  • %~fn % n geçerli bir dosya adı veya dizinse% n tam yolunu döndürür

1 EKLE

Gizemli ~ tilde operatörü için iyi bir referans buldum .

%~Dize denir yaklaşık işareti yüzde operatörü. Sen gibi durumlarda bulabilirsiniz: %~0.

:~Dize denir yaklaşık işareti kolon operatörü. Gibi bulabilirsiniz %SOME_VAR:~0,-1%.

2 EKLE - 13:12 19.07.2018

%1-%9komut satırı argümanlarına bakın. Böyle bir durumda değil geçerli bir yol değerleri, %~dp1- %~dp9tüm aynı değere genişleyecektir %~dp0. Onlar Ama eğer vardır geçerli bir yol değerleri, bunlar genişleyecek kendi sürücü / Yol değerinin.

Örneğin: (batch.bat)

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

Çalışma 1:

D:\Workbench>batch arg1 arg2

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

2. Yarış:

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

~dp0= D:\Workbench\
~dp1= c:\123\
~dp2= e:\abc\

Ayrıca bu kavram hakkında merak ve iyi açıklama burada bulundu. Teşekkürler Mingge. ^ _ ^
Eugene

1
benim için c: \ bat_files \ (sondaki yol ayırıcısı ile) genişler
santa

Microsoft makalesi ve forum iş parçacığı bağlantıları artık çalışmıyor :(
wovano

150

%0Bir toplu iş komut dosyasındaki değişken , yürütme toplu iş dosyasının adına ayarlanır.

~dpArasında özel bir sözdizimi %ve 0temelde değişken genişletmeye diyor %0toplu dosyasını içeren aktüel dizini verir sürücü harfi ve yolu göstermek için!

Yardım = Bağlantı


@Andy, %0.bat dosyasını yerel sabit sürücüye kaydetmeden doğrudan cmd'de test etmenin herhangi bir yolu var mı ?
Pacerier

Bağlantı koptu ve doğru bağlantıyı bulamıyorum. Bekleyen bir düzenlemenin bağlantısı hala kesilmiş.
George_E

44

% ~ dp0 çalışan toplu iş dosyasının geçerli dizin yoluna genişler.

Anlaşılır olmak için, bir dizinde bir toplu iş dosyası oluşturalım.

C: \ komut \ test.bat

içeriği ile:

@echo off
echo %~dp0

Komut isteminden çalıştırdığınızda şu sonucu görürsünüz:

C: \ komut \


40

Çok yardımcı olacak başka bir ipucu, geçerli dizini ilk önce kullanmak zorunda kalacak farklı bir sürücüye ayarlamaktır . Bu, dizini toplu iş dosyasının sürücüsüne, ardından klasörüne değiştirir.%~d0cd %~dp0

Alternatif olarak, #oneLinerLovers için @Omni'nin yorumlarda belirttiği gibi cd /d %~dp0hem sürücüyü hem de dizini değiştirecektir :)

Umarım bu birine yardımcı olur.


22
cdhem sürücüyü hem de klasörü değiştirecek yerleşik bir parametreye sahiptir:cd /d %~dp0
OmnipotentEntity

2
Haklısın ve /dargüman yararlıdır, ama bir şekilde yayınlanmıştır hak aday alternatif cevap ve bir açıklama için bu bir. Gerçi bunu işaret ettiğiniz için teşekkür ederim , bunu bilmiyordum :)
Marvin Thobejane

4
ayrıca sürücü ve klasörü değiştirmek için '' pushd% ~ dp0 '' kullanabilirsiniz
fmuecke

25

Çilek Perl'in taşınabilir kabuk başlatıcısından harika bir örnek:

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%

negatif 1 orada kendim ne yapıyor emin değilim, ama bir tedavi çalışıyor!


11
+1 çok yararlı. İf ifadesi bir ters eğik çizgi olup olmadığını kontrol eder ve gerekirse ters eğik çizgiyi kaldırır. Koşuldaki negatif 1 son karakteri ayıklar ve set deyimindeki ifade yol dizesini eksi son karakteri (ters eğik çizgi) alır.
Matt

1
negatif 1 eksi son karakterdir. Değişken alt dize
phuclv

12

Bir örnek güzel olurdu - işte önemsiz bir örnek

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

geçerli klasördeki her dosyanın yalnızca UZANTILARINI listeler

CMD komut isteminden daha kullanışlı değişken kombinasyonları (önceki yanıtta da listelenmiştir) yürütme: HELP FOR bu snippet'i içerir

Değiştiriciler bileşik sonuçlar elde etmek için birleştirilebilir:

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

"~ x şu anda beklenmedikti" var. örneği deniyorum - Win 7 kullanıyorum çünkü?
Chapter3

Bu iyi bir bilgidir, ancak orijinal postayı ele almaz.
De Shan Baptiste
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.