Bir Windows toplu iş dosyası kendi dosya adını belirleyebilir mi?


122

Bir Windows toplu iş dosyası kendi dosya adını belirleyebilir mi?

Örneğin, C: \ Temp \ myScript.bat toplu iş dosyasını çalıştırırsam, myScript.bat içinde "myScript.bat" dizesini belirleyebilen bir komut var mı?


1
%0aradığınız şey. Daha fazlası için [bu soru] [1] 'ya bakın. [1]: stackoverflow.com/questions/357315/…
Jonathon Reinhart

2
Evet, aradığım buydu. Cevap% ~ nx0.
djangofan

Yanıtlar:


161

Evet.

%0Mevcut dosyanın yolunu almak için özel değişkeni kullanın .

%~n0Uzantı olmadan yalnızca dosya adını almak için yazın .

%~n0%~x0Dosya adını ve uzantıyı almak için yazın .

%~nx0Dosya adını ve uzantısını almak için yazmak da mümkündür .


1
Bu sadece yanlış. Hem% 0 hem de% ~ n0 yalnızca dosya adı kısmını alır. @djangofan 'ın yanıtı doğru.
JustJeff

5
% 0, dosyanın çağrıldığı yolu döndürür. Tam bir yol kullanılmışsa,% 0 buna sahip olacaktır. Eğer varsa cdöncelikle dir içine ve oradan toplu yürütmek,% 0 genellikle yol bilgisini olmaz (ama bu durumda% cd den% o alabilir)
Gogowitsch

@gogowitsch: Emin misin? Bunun doğru olduğunu sanmıyorum.
SLaks

Win2012'de, %cd%toplu iş dosyasını çağıran işlemin Geçerli Dizinini döndürür. Öyleyse, bir komut istemindeyseniz D:\dir1ve girin Y:\foo\bar.bat, varsa bar.bat, @echo %cd%çıktı alacaktır D:\dir1.
Preacher

48

Dosya adını alabilirsiniz, ancak '% ~' ve '0' arasına ne yerleştirdiğinize bağlı olarak tam yolu da alabilirsiniz. Seçiminizi yapın

d -- drive
p -- path
n -- file name
x -- extension
f -- full path

Örneğin, c: \ tmp \ foo.bat'ın içinden %~nx0size "foo.bat" %~dpnx0verirken "c: \ tmp \ foo.bat" verir. Parçaların her zaman standart düzende bir araya getirildiğini unutmayın, bu nedenle sevimli olur ve denerseniz %~xnpd0, yine de "c: \ tmp \ foo.bat" alırsınız.


3
Kod bloğunuzda, fbunun dosya adı olduğunu, ancak örneklerinizde ndosya adı için kullandığınızı belirtirsiniz . Bazı testlerden sonra, bu ftam yol ve ndosya adı gibi görünüyor .
Drew Chapin

@druciferre, cevabı yorumunuza göre düzenledim
robotik

"Şirinleşir ve denersen %~xnpd0" ... Seni seviyorum.
Mark Deven

32

Aşağıdaki komut dosyasını kullanarak SLaks cevabına göre doğru cevabın olduğunu belirledim:

echo The name of this file is: %~n0%~x0
echo The name of this file is: %~nx0

Ve işte test komut dosyam:

@echo off
echo %0
echo %~0
echo %n0
echo %x0
echo %~n0
echo %dp0
echo %~dp0
pause

İlginç bulduğum şey, '~' karakterinin genellikle bir değişkendeki tırnak işaretlerini çıkarmak / kesmek için kullanıldığını bildiğimiz için % nx0'ın çalışmayacağıdır.


9

Bunun 0, bir toplu iş dosyası içindeki özel bir parametre numarası durumu olduğunu unutmayın; burada bu dosya, komut satırında verildiği0 anlamına gelir .

Dolayısıyla, dosya myfile.bat ise, onu aşağıdaki gibi çeşitli şekillerde çağırabilirsiniz, bunların her biri size veya kullanımından farklı bir çıktı verir :%0%~0

myfile

myfile.bat

mydir\myfile.bat

c:\mydir\myfile.bat

"c:\mydir\myfile.bat"

Yukarıdakilerin tümü, bulunduğu dizine doğru göreceli yerden ararsanız, yasal aramalardır. %~0son örnekten alıntıları çıkarır, oysa %0çıkarmaz.

Bu nedenle tüm farklı sonuçlar verir, %0 ve %~0aslında kullanmak istediğiniz olmak çok olası değildir.

İşte açıklanacak bir toplu iş dosyası:

@echo Full path and filename: %~f0
@echo Drive: %~d0
@echo Path: %~p0
@echo Drive and path: %~dp0
@echo Filename without extension: %~n0
@echo Filename with    extension: %~nx0
@echo Extension: %~x0
@echo Filename as given on command line: %0
@echo Filename as given on command line minus quotes: %~0
@REM Build from parts
@SETLOCAL
@SET drv=%~d0
@SET pth=%~p0
@SET fpath=%~dp0
@SET fname=%~n0
@SET ext=%~x0
@echo Simply Constructed name: %fpath%%fname%%ext%
@echo Fully  Constructed name: %drv%%pth%%fname%%ext%
@ENDLOCAL
pause

3

Büyülü değişkenlerin nasıl çalıştığını hissetmek için aşağıdaki örneği çalıştırmayı deneyin.

@echo off

SETLOCAL EnableDelayedExpansion

echo Full path and filename: %~f0
echo Drive: %~d0
echo Path: %~p0
echo Drive and path: %~dp0
echo Filename without extension: %~n0
echo Filename with    extension: %~nx0
echo Extension: %~x0

echo date time : %~t0
echo file size: %~z0

ENDLOCAL

İlgili kurallar takip edilmektedir.

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

0

İlk kodum aşağıdadır:

@echo off
Set z=%%
echo.
echo %z%0.......%0
echo %z%~0......%~0
echo %z%n0......%n0
echo %z%x0......%x0
echo %z%~n0.....%~n0
echo %z%dp0.....%dp0
echo %z%~dp0....%~dp0
echo.

% ~ 0 ve% 0 tarafından verilen dosya adının komut kabuğuna girilme şekli olduğunu ve dosyanın gerçekte nasıl adlandırıldığını fark ettim. Bu nedenle, dosya adı için gerçek durumun kullanılmasını istiyorsanız,% ~ n0 kullanmalısınız. Ancak bu, dosya uzantısını dışarıda bırakacaktır. Ancak dosya adını biliyorsanız, aşağıdaki kodu ekleyebilirsiniz.

set b=%~0
echo %~n0%b:~8,4%

": ~% 8,4" ifadesinin değişkenin 9. karakterinden başladığını ve ardından sonraki 4 karakteri göster anlamına geldiğini öğrendim. Aralık 0 ile değişken dizenin sonuna kadardır. Yani% Path% çok uzun olurdu!

fIlEnAmE.bat
012345678901

Ancak, bu Jool'un yukarıdaki çözümü (% ~ x0) kadar sağlam değil.

Kanıtım:

C:\bin>filename.bat

%0.......filename.bat
%~0......filename.bat
. . .

C:\bin>fIlEnAmE.bat

%0.......fIlEnAmE.bat
%~0......fIlEnAmE.bat
%n0......n0
%x0......x0
%~n0.....FileName
%dp0.....dp0
%~dp0....C:\bin\

%~n0%b:~8,4%...FileName.bat

Press any key to continue . . .

C:\bin>dir
 Volume in drive C has no label.
 Volume Serial Number is CE18-5BD0

 Directory of C:\bin
. . .
05/02/2018  11:22 PM               208 FileName.bat

İşte son kod

@echo off
Set z=%%
set b=%~0
echo.
echo %z%0.......%0
echo %z%~0......%~0
echo %z%n0......%n0
echo %z%x0......%x0
echo %z%~n0.....%~n0
echo %z%dp0.....%dp0
echo %z%~dp0....%~dp0
echo.
echo A complex solution:
echo ===================================
echo %z%~n0%z%b:~8,4%z%...%~n0%b:~8,4%
echo ===================================
echo.
echo The preferred solution:
echo ===================================
echo %z%~n0%z%~x0.......%~n0%~x0
echo ===================================
pause
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.