Dòng lệnh .cmd / .bat script, cách lấy thư mục của script đang chạy


Câu trả lời:


57

Raymond Chen có một vài ý tưởng:

https://devblogs.microsoft.com/oldnewthing/20050128-00/?p=36573

Trích dẫn đầy đủ ở đây vì các kho lưu trữ MSDN có xu hướng hơi không đáng tin cậy:

Cách dễ dàng là sử dụng %CD%biến giả. Nó mở rộng đến thư mục làm việc hiện tại.

set OLDDIR=%CD%
.. do stuff ..
chdir /d %OLDDIR% &rem restore current directory

(Tất nhiên, lưu / khôi phục thư mục có thể được thực hiện dễ dàng hơn với pushd/ popd, nhưng đó không phải là vấn đề ở đây.)

Thủ %CD%thuật này rất hữu ích ngay cả từ dòng lệnh. Ví dụ, tôi thường thấy mình đang ở trong một thư mục có tệp mà tôi muốn thao tác nhưng ... ồ, tôi cần chuyển đến một số thư mục khác để thực hiện thao tác đó.

set _=%CD%\curfile.txt
cd ... some other directory ...
somecommand args %_% args

(Tôi muốn sử dụng %_%làm biến môi trường đầu của mình.)

Nhập SET /?để xem các biến giả khác được cung cấp bởi bộ xử lý lệnh.

Ngoài ra, các nhận xét trong bài viết cũng rất đáng để quét, ví dụ như nhận xét này (thông qua WayBack Machine, vì các nhận xét đã biến mất từ ​​các bài viết cũ hơn):

http://blogs.msdn.com/oldnewthing/archive/2005/01/28/362565.aspx#362741

Điều này bao gồm việc sử dụng% ~ dp0:

Nếu bạn muốn biết vị trí của tệp loạt: %~dp0

%0là tên của tệp hàng loạt. ~dpcung cấp cho bạn ổ đĩa và đường dẫn của đối số được chỉ định.


13
Điều này không trả lời câu hỏi. % CD% cung cấp thư mục hiện tại, trong khi những gì được hỏi là thư mục của tập lệnh.
ketorin 07/10/08

3
@ketorin: Điều này KHÔNG trả lời câu hỏi. % CD% sẽ thay đổi nếu bản thân tập lệnh thay đổi thư mục trong suốt quá trình sử dụng nó (pushd / cd / ..) nhưng % ~ dp0 sẽ KHÔNG thay đổi và luôn trỏ đến vị trí của tập lệnh.
Jay

-1 Tôi không thể biết điều này có trả lời câu hỏi hay không. Bạn có thể chỉ cho tôi một ví dụ?
Iain Samuel McLean Elder

1
@IainElder - bạn có thể đúng, tôi đã truy cập lại câu trả lời này vài ngày trước và không quá hài lòng với nó. Các bình luận trên blog của Raymond Chen, mà tôi tham khảo, dường như đã bị MS đánh lừa - vì vậy, có những nguy cơ của những câu trả lời hoàn toàn dựa vào các nguồn bên ngoài được liên kết. Tôi đã cố gắng tìm một số tài liệu khác để sao lưu câu trả lời của mình nhưng bây giờ nó đã quá lâu rồi. Gắn cờ để xóa. Cảm ơn vì đã giúp tôi vượt qua cái này :) Bạn không tình cờ làm việc cho SkyScanner phải không?
Kev

1
@Kev Có thể tham khảo các nguồn bên ngoài nếu bạn sao chép phần hữu ích vào Stack Overflow. Tôi đoán bây giờ đã quá muộn! Và vâng, tôi đã được biết là ẩn náu trong trung tâm dữ liệu Skyscanner ;-)
Iain Samuel McLean Elder

146

Điều này tương đương với đường dẫn của script:

%~dp0

Điều này sử dụng cú pháp mở rộng tham số lô. Tham số 0 luôn là chính tập lệnh.

Nếu tập lệnh của bạn được lưu trữ tại C:\example\script.bat, thì %~dp0đánh giá là C:\example\.

ss64.com có thêm thông tin về cú pháp mở rộng tham số. Đây là đoạn trích liên quan:

Bạn có thể nhận giá trị của bất kỳ tham số nào bằng cách sử dụng% theo sau là vị trí số của nó trên dòng lệnh.

[...]

Khi một tham số được sử dụng để cung cấp tên tệp thì có thể áp dụng cú pháp mở rộng sau:

[...]

% ~ d1 Chỉ mở rộng% 1 thành ký tự Drive - C:

[...]

% ~ p1 Chỉ mở rộng% 1 thành một Đường dẫn, ví dụ: \ utils \ điều này bao gồm một dấu chấm \ có thể được hiểu là một ký tự thoát bởi một số lệnh.

[...]

Các bổ ngữ ở trên có thể được kết hợp:

% ~ dp1 Chỉ mở rộng% 1 thành ký tự ổ đĩa và đường dẫn

[...]

Bạn có thể lấy tên đường dẫn của chính tập lệnh lô với% 0, các phần mở rộng tham số có thể được áp dụng cho điều này để% ~ dp0 sẽ trả về Drive và Đường dẫn đến tập lệnh lô, ví dụ W: \ scripts \


Chính xác những gì tôi cần. Và tôi đã liên kết anwser này với blog của mình, như một lời nhắc nhở :)
Olivier H

Không chắc đó có phải là lỗi / lỗi trong văn bản được trích dẫn hay không, nhưng trong tập lệnh của tôi, tôi cần "% ~ d0" để lấy ký tự ổ đĩa! % ~ d1 trống trong trường hợp của tôi.
fklappan

Trong mắt tôi / tình huống này cao hơn câu trả lời được chấp nhận. Nếu bạn chạy tập lệnh dòng lệnh "với tư cách Quản trị viên" (nhấp chuột phải vào nó) thì tập lệnh của bạn sẽ được thực thi từ Windows \ system32. Câu trả lời được chấp nhận sẽ KHÔNG cung cấp cho bạn vị trí tập lệnh, nó sẽ cung cấp lại cho bạn Windows \ system32. Câu trả lời tức là NÀY giúp bạn khắc phục điều đó, bạn bắt đầu kịch bản của bạn với cd% ~ dp0
Jaroslav Záruba

0
for /F "eol= delims=~" %%d in ('CD') do set curdir=%%d

pushd %curdir%

Nguồn


Không đủ tài liệu hoặc sự biện minh.
BenPen
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.