2009-03-11 43 views
168

Tôi muốn lấy tên của tệp lô hiện đang chạy mà không cần đuôi tệp.Cách tốt nhất để thực hiện chuỗi con trong tập tin batch là gì?

Nhờ this link, tôi có tên tệp với số tiện ích mở rộng ... nhưng cách tốt nhất để thực hiện chuỗi con trong tệp lô là gì?

Hoặc có cách nào khác để lấy tên tệp bằng phần mở rộng không?

Có thể giả định 3 tiện ích thư trong trường hợp này.

Trả lời

346

Vâng, chỉ cần lấy tên tệp của lô của bạn, cách dễ nhất là chỉ sử dụng %~n0.

@echo %~n0 

sẽ xuất tên (không có phần mở rộng) của tệp bó hiện đang chạy (trừ khi được thực thi trong chương trình con được gọi là call). Danh sách đầy đủ như vậy thay thế “đặc biệt” cho tên đường dẫn có thể được tìm thấy với help for, vào cuối sự giúp đỡ:

Bên cạnh đó, thay thế CHO tài liệu tham khảo biến đã được tăng cường. Bây giờ bạn có thể sử dụng tùy chọn cú pháp sau:

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

Các bổ trợ có thể kết hợp để có được kết quả hợp chất:

%~dpI  - expands %I to a drive letter and path only 
%~nxI  - expands %I to a file name and extension only 
%~fsI  - expands %I to a full path name with short names only 

Để trả lời chính xác câu hỏi của bạn, tuy nhiên: chuỗi con được thực hiện bằng ký hiệu :~start,length:

%var:~10,5% 

sẽ trích xuất 5 ký tự từ vị trí 10 trong biến môi trường %var%.

LƯU Ý: Các chỉ số của chuỗi là không dựa, do đó ký tự đầu tiên là ở vị trí 0, thứ hai tại 1, vv

Để có được chuỗi con của các biến lập luận như %0, %1, vv . bạn phải gán chúng vào một biến môi trường bình thường sử dụng set đầu tiên:

:: Does not work: 
@echo %1:~10,5 

:: Assign argument to local variable first: 
set var=%1 
@echo %var:~10,5% 

cú pháp thậm chí còn mạnh hơn:

  • %var:~-7% chiết xuất 7 ký tự cuối cùng từ %var%
  • %var:~0,-4% sẽ trích xuất tất cả các nhân vật ngoại trừ cuối bốn mà cũng sẽ giúp bạn thoát khỏi phần mở rộng tập tin (giả sử ba nhân vật sau giai đoạn [.]).

Xem help set để biết chi tiết về cú pháp đó.

+0

Đó là câu trả lời tuyệt vời, toàn diện. Cảm ơn rất nhiều. – JosephStyons

+0

Vâng, bây giờ, ba câu trả lời được chuyển thành một hoặc nhiều hơn, nhờ Patrick :) – Joey

+18

Trích xuất chuỗi con không hoạt động với biến vòng FOR, do đó bạn sẽ phải thực hiện như sau (\ r \ n trong dòng có nghĩa là mã ngắt vì SO dường như không cho phép ngắt dòng trong nhận xét): 'setlocal ENABLEDELAYEDEXPANSION \ r \ n cho/f %% s trong ('set') làm (\ r \ n \t set tmp = %% s \ r \ n \t echo! Tmp: ~ -3! \ R \ n ) ' – Fr0sT

26

Được giải thích rõ ràng ở trên!

Đối với tất cả những người có thể chịu đựng như tôi để làm việc này trong Windows cục bộ (tôi là XP trong Slovak), bạn có thể thử để thay thế % với một !

Vì vậy:

SET TEXT=Hello World 
SET SUBSTRING=!TEXT:~3,5! 
ECHO !SUBSTRING! 
+18

Lưu ý điều này sẽ chỉ hoạt động sau lệnh' setlocal ENABLEDELAYEDEXPANSION' – Fr0sT

+0

Hoặc nếu bạn gọi dòng lệnh bằng/V, tức là 'cmd/v' – Omertron

11

Là thông tin bổ sung cho câu trả lời của Joey, câu trả lời này không được mô tả trong phần trợ giúp của set /? cũng không phải for /?.

%~0 mở rộng đến tên của lô riêng, chính xác như được nhập.
Vì vậy, nếu bạn bắt đầu hàng loạt của bạn nó sẽ được mở rộng như

%~0 - mYbAtCh 
%~n0 - mybatch 
%~nx0 - mybatch.bat 

Nhưng có một ngoại lệ, mở rộng trong một chương trình con có thể thất bại

echo main- %~0 
call :myFunction 
exit /b 

:myFunction 
echo func - %~0 
echo func - %~n0 
exit /b 

Điều này dẫn đến

main - myBatch 
Func - :myFunction 
func - mybatch 

Trong hàm %~0 mở rộng luôn với tên của hàm, không phải của tệp lô.
Nhưng nếu bạn sử dụng ít nhất một công cụ sửa đổi, nó sẽ hiển thị lại tên tệp!

Các vấn đề liên quan