Một tệp loạt Windows có thể xác định tên tệp của chính nó không?


121

Một tệp loạt Windows có thể xác định tên tệp của chính nó không?

Ví dụ: nếu tôi chạy tệp loạt C: \ Temp \ myScript.bat, có lệnh nào trong myScript.bat có thể xác định chuỗi "myScript.bat" không?


1
%0là 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/…
Jonathon Reinhart

2
Vâng, đó là những gì tôi đang tìm kiếm. % ~ nx0 là câu trả lời.
djangofan

Câu trả lời:


160

Đúng.

Sử dụng %0biế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.


1
Điều này chỉ là không chính xác. Cả% 0 và% ~ n0 chỉ lấy phần tên tệp. Câu trả lời của @djangofan là đúng.
JustJeff

5
% 0 trả về cách tệp được gọi. Nếu một đường dẫn đầy đủ được sử dụng,% 0 sẽ có đường dẫn đó. Nếu bạn cdvà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 đó)
Gogowitsch

@gogowitsch: Bạn có chắc không? Tôi không nghĩ đó là sự thật.
SLaks,

Trên Win2012, %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:\dir1và nhập Y:\foo\bar.bat, nếu bar.bat@echo %cd%thì nó sẽ xuất D:\dir1.
giảng đạo

48

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, %~nx0cung cấp cho bạn "foo.bat", trong khi %~dpnx0cung 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"


3
Trong khối mã của bạn, bạn nêu đó flà tên tệp, nhưng trong các ví dụ của bạn, bạn sử dụng ntên tệp. Sau một số thử nghiệm, có vẻ như đó flà đường dẫn đầy đủ và nlà tên tệp.
Drew Chapin

@druciferre, tôi thay đổi nội dung các câu trả lời theo nhận xét của bạn
robotik

"If you get cute and try %~xnpd0" ... I love you.
Mark Deven

32

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.


9

Hãy nhớ rằng đó 0là 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 đó 0có 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 %0hoặc %~0cá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. %~0tá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%~0rấ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

3

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

0

Dưới đây là mã ban đầu của tôi:

@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.

Bằng chứng của tôi:

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

Đây là mã cuối cùng

@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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.