Câu trả lời:
Đúng.
Sử dụng %0
biến đặc biệt để lấy đường dẫn đến tệp hiện tại.
Viết %~n0
để chỉ lấy tên tệp mà không có phần mở rộng.
Viết %~n0%~x0
để lấy tên tệp và phần mở rộng.
Cũng có thể ghi %~nx0
để lấy tên tệp và phần mở rộng.
cd
vào thư mục đầu tiên và thực hiện hàng loạt từ đó,% 0 sẽ thường không có thông tin đường dẫn (nhưng bạn có thể nhận được rằng từ% cd% trong trường hợp đó)
%cd%
sẽ trả về Thư mục hiện tại của quá trình được gọi là tệp lô. Vì vậy, nếu bạn đang ở một dấu nhắc trong D:\dir1
và nhập Y:\foo\bar.bat
, nếu bar.bat
có @echo %cd%
thì nó sẽ xuất D:\dir1
.
Bạn có thể lấy tên tệp, nhưng bạn cũng có thể lấy đường dẫn đầy đủ, tùy thuộc vào những gì bạn đặt giữa '% ~' và '0'. Chọn của bạn từ
d -- drive
p -- path
n -- file name
x -- extension
f -- full path
Ví dụ: từ bên trong c: \ tmp \ foo.bat, %~nx0
cung cấp cho bạn "foo.bat", trong khi %~dpnx0
cung cấp "c: \ tmp \ foo.bat". Lưu ý rằng các mảnh luôn được lắp ráp theo thứ tự chuẩn, vì vậy nếu bạn thấy dễ thương và cố gắng %~xnpd0
, bạn vẫn nhận được "c: \ tmp \ foo.bat"
f
là tên tệp, nhưng trong các ví dụ của bạn, bạn sử dụng n
tên tệp. Sau một số thử nghiệm, có vẻ như đó f
là đường dẫn đầy đủ và n
là tên tệp.
%~xnpd0
" ... I love you.
Sử dụng tập lệnh sau, dựa trên câu trả lời SLaks, tôi đã xác định rằng câu trả lời đúng là:
echo The name of this file is: %~n0%~x0
echo The name of this file is: %~nx0
Và đây là kịch bản thử nghiệm của tôi:
@echo off
echo %0
echo %~0
echo %n0
echo %x0
echo %~n0
echo %dp0
echo %~dp0
pause
Điều tôi thấy thú vị là % nx0 sẽ không hoạt động, vì chúng ta biết ký tự '~' thường được sử dụng để loại bỏ / cắt bớt dấu ngoặc kép của một biến.
Hãy nhớ rằng đó 0
là một trường hợp đặc biệt của các số tham số bên trong một tệp loạt, trong đó 0
có nghĩa là tệp này như được đưa ra trên dòng lệnh .
Vì vậy, nếu tệp là myfile.bat, bạn có thể gọi nó theo một số cách như sau, mỗi cách sẽ cung cấp cho bạn một đầu ra khác với %0
hoặc %~0
cách sử dụng:
myfile
myfile.bat
mydir\myfile.bat
c:\mydir\myfile.bat
"c:\mydir\myfile.bat"
Tất cả những điều trên đều là cuộc gọi hợp pháp nếu bạn gọi nó từ đúng vị trí tương đối với thư mục mà nó tồn tại. %~0
tách các trích dẫn từ ví dụ cuối cùng, trong khi%0
không.
Bởi vì tất cả những thứ này đều cho kết quả khác nhau %0
và %~0
rất khó có thể là những gì bạn thực sự muốn sử dụng.
Đây là một tệp hàng loạt để minh họa:
@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
Hãy thử chạy ví dụ dưới đây để cảm nhận cách hoạt động của các biến kỳ diệu.
@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
Các quy tắc liên quan được tuân theo.
%~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.
Tôi nhận thấy rằng tên tệp được cung cấp bởi% ~ 0 và% 0 là cách nó được nhập trong command-shell chứ không phải cách tệp đó thực sự được đặt tên. Vì vậy, nếu bạn muốn chữ hoa chữ thường được sử dụng cho tên tệp, bạn nên sử dụng% ~ n0. Tuy nhiên, điều này sẽ loại bỏ phần mở rộng tệp. Nhưng nếu bạn biết tên tệp, bạn có thể thêm mã sau.
set b=%~0
echo %~n0%b:~8,4%
Tôi đã học được rằng ": ~ 8,4%" có nghĩa là bắt đầu ở ký tự thứ 9 của biến và sau đó hiển thị 4 ký tự tiếp theo. Phạm vi là 0 đến cuối chuỗi biến. Vì vậy,% Path% sẽ rất dài!
fIlEnAmE.bat
012345678901
Tuy nhiên, đây không phải là giải pháp của Jool (% ~ x0) ở trên.
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
là những gì bạn đang tìm kiếm. Xem [câu hỏi này] [1] để biết thêm. [1]: stackoverflow.com/questions/357315/…