Bir Windows toplu iş dosyasında% ~ d0 ne anlama geliyor?


355

Aşağıdaki değişkenleri tanımlayan bir toplu iş dosyasına bakıyorum:

set _SCRIPT_DRIVE=%~d0
set _SCRIPT_PATH=%~p0
  • Ne yapmak %~d0veya %~p0aslında demek?
  • Bir dizinin geçerli dizini, sürücüsü, parametreleri gibi şeyler için iyi bilinen değerler kümesi var mı?
  • Kullanabileceğim başka benzer kısayollar var mı?

Yanıtlar:


541

Sihirli değişkenler %n , dosyayı çağırmak için kullanılan bağımsız değişkenleri içerir: %0yarasa dosyasının kendisinin yoludur %1, sonraki ilk bağımsız değişkendir %2, ikincisidir vb.

Bağımsız değişkenler genellikle dosya yolları olduğundan, yolun bölümlerini ayıklamak için bazı ek sözdizimi vardır. ~dsürücü, ~pyol (sürücü olmadan), ~ndosya adıdır. Bunlar ~dpsürücü + yol gibi birleştirilebilir .

%~dp0 bu nedenle bir yarasada oldukça kullanışlıdır: yürütme yarasa dosyasının bulunduğu klasördür.

Ayrıca dosya hakkında başka türlü meta bilgi de alabilirsiniz: ~tzaman damgası, ~zboyuttur.

Tüm komut satırı komutları için bir başvuru için buraya bakın . Yaklaşık-sihirli kodlar altında açıklanan için .


15
self to note: echo %~dp0komut satırında çalışmaz, yalnızca toplu iş dosyasında. Duh!
northben

2
%~d0ve arasında bir fark var %~d0%mı?
Geoffrey

2
@Pacerier:% 0, komut dosyasının dosya adını içeren tam yoldur. % ~ dp0, komut dosyasını içeren ancak komut dosyasının dosya adını hariç tutan klasörün yoludur.
JacquesB

4
self to note: echo %~pd0eko ile aynı çıktıyı verir %~dp0(beklendiği gibi tersine değil). Ayrıca değeri %0olan çift tıklıyorsunuz bağlı olarak, farklı toplu dosya veya cmd den çalıştırın.
Pacerier

152

Bunlar, geliştirilmiş değişken ikamelerdir. Toplu iş dosyalarında kullanılan% N değişkenlerini değiştirirler. Windows'da toplu programlama yapıyorsanız oldukça yararlıdır.

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

Yukarıdakileri çalıştırarak bulabilirsiniz FOR /?.


48

Evet, aşağıda verilen başka kısayollar da vardır. Komutunuzda ~ d0, 0 argümanının harfini ifade eder.

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

0. bağımsız değişken komut dosyası yolu olduğundan, yolun sürücü harfini sizin için alır. Aşağıdaki kısayolları da kullanabilirsiniz.

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

Bu, CALL /? Komutunu çalıştırdığınızda doğrudan komut isteminde de bulunabilir. yada ... için /?



9

Ç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

#OneLinerLovers için cd /d %~dp0hem sürücüyü hem de dizini değiştirir :)

Umarım bu birine yardımcı olur.


7
pushd %~dp0mevcut sürücüyü değiştirme konusunda hiçbir problemi olmayan ve popddaha sonra orijinal sürücüye / yola geri dönme avantajını veren başka bir seçenek .
bcrist


6

Dikkat edilmesi gereken bazı şeyler:

Eğer varsa çift tıklama toplu iş dosyası %0tırnak içine alınacaktır. Örneğin, bu dosyayı şu şekilde kaydederseniz c:\test.bat:

@echo %0
@pause

Çift tıklandığında çıktı ile yeni bir komut istemi açılır:

"C:\test.bat"

Ancak, önce bir komut istemi açar ve doğrudan bu komut isteminden çağırırsanız, yazdığınız%0 her şeyi belirtir . Siz yazarsanız , hiçbir tırnak yazmamanız nedeniyle çıktısının tırnak işareti olmaz:test.batEnter%0

c:\>test.bat
test.bat

Eğer yazarsanız testEnter, %0hiçbir uzantı yazmamanız nedeniyle çıktısının da uzantısı olmayacaktır:

c:\>test
test

Aynı tEsTEnter:

c:\>tEsT
tEsT

Yazarsanız "test"Enter, çıktısının %0tırnak işaretleri olur (yazdığınızdan beri), ancak uzantı içermez:

c:\>"test"
"test"

Son olarak, yazarsanız "C:\test.bat", çıktı tam olarak çift tıklamış gibi olur:

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

Bunların olası tüm değerler olmadığını unutmayın %0çünkü komut dosyasını diğer klasörlerden çağırabilirsiniz:

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

Yukarıda gösterilen tüm örnekler de etkilenecektir %~0, çünkü çıktısı %~0basitçe %0 eksi tırnak (varsa) çıktısıdır .


3

Bu kod benim için en kafa karıştırıcı olan ~ tilda karakterinin kullanımını açıklıyor. Bunu anladıktan sonra, şeyleri anlamak çok daha kolay hale gelir:

@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

1

Şu anda içinde bulunduğunuz dosyanın veya dizinin geçerli konumunu görüntüler. Örneğin; toplu iş dosyanız masaüstü dizinindeyse "% ~ dp0" masaüstü dizinini görüntüler. geçerli dizini geçerli dosya adıyla görüntülemesini istiyorsanız "% ~ dp0% ~ n0% ~ x0" yazabilirsiniz.


"% ~ dpnx0" daha iyi olurdu
FrinkTheBrave
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.