Odpowiedzi:
Tak.
Użyj specjalnej %0
zmiennej, aby uzyskać ścieżkę do bieżącego pliku.
Napisz, %~n0
aby uzyskać tylko nazwę pliku bez rozszerzenia.
Napisz, %~n0%~x0
aby uzyskać nazwę i rozszerzenie pliku.
Można również napisać, %~nx0
aby uzyskać nazwę pliku i rozszerzenie.
cd
do katalogu i uruchomisz pakiet z tego miejsca,% 0 zwykle nie będzie zawierał informacji o ścieżce (ale w tym przypadku można je uzyskać z% cd%)
%cd%
zwróci bieżący katalog procesu, który wywołał plik wsadowy. Tak więc, jeśli pojawi się monit D:\dir1
i wpisz Y:\foo\bar.bat
, jeśli bar.bat
ma, @echo %cd%
to wyświetli się D:\dir1
.
Możesz uzyskać nazwę pliku, ale możesz także uzyskać pełną ścieżkę, w zależności od tego, co umieścisz między „% ~” a „0”. Wybierz spośród
d -- drive
p -- path
n -- file name
x -- extension
f -- full path
Np. Z wnętrza c: \ tmp \ foo.bat %~nx0
daje "foo.bat", podczas gdy %~dpnx0
daje "c: \ tmp \ foo.bat". Zauważ, że elementy są zawsze montowane w kolejności kanonicznej, więc jeśli spodobasz się i spróbujesz %~xnpd0
, nadal otrzymasz „c: \ tmp \ foo.bat”
f
jest to nazwa pliku, ale w przykładach używasz n
jako nazwy pliku. Po kilku testach wygląda na to, że f
jest to pełna ścieżka i n
nazwa pliku.
%~xnpd0
”… Kocham cię.
Korzystając z poniższego skryptu, na podstawie odpowiedzi SLaks, ustaliłem, że prawidłowa odpowiedź to:
echo The name of this file is: %~n0%~x0
echo The name of this file is: %~nx0
A oto mój skrypt testowy:
@echo off
echo %0
echo %~0
echo %n0
echo %x0
echo %~n0
echo %dp0
echo %~dp0
pause
Co mnie interesuje, to to, że % nx0 nie zadziała, biorąc pod uwagę, że wiemy, że znak '~' jest zwykle używany do usuwania / przycinania cudzysłowów zmiennej.
Należy pamiętać, że 0
jest to specjalny przypadek numerów parametrów w pliku wsadowym, gdzie 0
oznacza ten plik podany w wierszu poleceń .
Więc jeśli plik to myfile.bat, możesz wywołać go na kilka sposobów w następujący sposób, z których każdy da inny wynik niż użycie %0
lub %~0
:
myfile
myfile.bat
mydir\myfile.bat
c:\mydir\myfile.bat
"c:\mydir\myfile.bat"
Wszystkie powyższe są połączeniami prawnymi, jeśli wywołasz je z właściwego względnego miejsca do katalogu, w którym istnieje. %~0
usuwa cytaty z ostatniego przykładu, %0
ale nie.
Ponieważ wszystkie one dają różne wyniki %0
i %~0
jest bardzo mało prawdopodobne, aby były tym, czego faktycznie chcesz użyć.
Oto plik wsadowy do zilustrowania:
@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
Spróbuj uruchomić poniższy przykład, aby poczuć, jak działają magiczne zmienne.
@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
Powiązane zasady są następujące.
%~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
@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.
Zauważyłem, że nazwa pliku podana przez% ~ 0 i% 0 jest sposobem, w jaki został wprowadzony w powłoce poleceń, a nie tym, jak faktycznie nazywa się ten plik. Więc jeśli chcesz użyć literału w nazwie pliku, powinieneś użyć% ~ n0. Jednak spowoduje to pominięcie rozszerzenia pliku. Ale jeśli znasz nazwę pliku, możesz dodać następujący kod.
set b=%~0
echo %~n0%b:~8,4%
Dowiedziałem się, że „: ~ 8,4%” oznacza rozpoczęcie od 9 znaku zmiennej, a następnie wyświetlenie kolejnych 4 znaków. Zakres wynosi od 0 do końca łańcucha zmiennej. Więc% Path% byłoby bardzo długie!
fIlEnAmE.bat
012345678901
Jednak nie jest to tak rozsądne, jak powyższe rozwiązanie Joola (% ~ x0).
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
@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
%0
jest tym, czego szukasz. Zobacz [to pytanie] [1] po więcej. [1]: stackoverflow.com/questions/357315/…