Câu hỏi Dòng lệnh .cmd / .bat script, cách lấy thư mục chạy tập lệnh


Làm thế nào bạn có thể nhận được thư mục của tập lệnh được chạy và sử dụng nó trong tệp .cmd?


76
2017-09-24 21:32


gốc


có thể trùng lặp Làm thế nào để có được đường dẫn của tập lệnh batch trong Windows? - Celada


Các câu trả lời:


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

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

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

Cách dễ dàng là sử dụng %CD% giả biến. 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, thư mục lưu / khôi phục có thể dễ dàng có   được thực hiện với pushd/popd, nhưng đó không phải là điểm ở đây.)

Các %CD% lừa là tiện dụng ngay cả từ dòng lệnh. Ví dụ, tôi   thường tìm thấy chính mình trong một thư mục có tệp mà tôi muốn   hoạt động trên nhưng ... oh, tôi cần phải chdir đến một số thư mục khác theo thứ tự   để thực hiện thao tác đó.

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

(Tôi thích sử dụng %_% như biến môi trường đầu của tôi.)

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

Ngoài ra các ý kiến ​​trong bài viết cũng có giá trị quét ví dụ này:

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 tin batch: %~dp0 

%0 là tên của tập tin thực thi. ~dp cung cấp cho bạn các ổ đĩa và con đường của   đối số được chỉ định.


55
2017-09-24 21:34



Đ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 thư được hỏi là thư mục của tập lệnh. - ketorin
@ketorin: Điều này LÀM trả lời câu hỏi. % CD% sẽ thay đổi nếu tập lệnh tự thay đổi thư mục trong suốt quá trình sử dụng (pushd / cd / ..) nhưng % ~ dp0 sẽ KHÔNG PHẢI thay đổi và luôn trỏ đến vị trí của tập lệnh. - Jay
-1 Tôi không thể nói điều này có trả lời được câu hỏi hay không. Bạn có thể chỉ cho tôi một ví dụ? - Iain Samuel McLean Elder
@IainElder - có lẽ bạn đã đú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ó. Những bình luận trên blog của Raymond Chen, mà tôi đề cập đến, dường như đã bị blitzed bởi MS - vì vậy trong đó có những mối nguy hiểm của câu trả lời dựa hoàn toàn 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 tôi, nhưng nó đã quá lâu trước đây trong mists của thời gian bây giờ. Gắn cờ để xóa. Cảm ơn bạn đã nghiêng tôi qua các cạnh với cái này :) Bạn không xảy ra làm việc cho SkyScanner phải không? - Kev
@Kev Bạn 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 giờ đã quá muộn rồi! Và có, tôi đã được biết là ẩn nấp trong trung tâm dữ liệu Skyscanner ;-) - Iain Samuel McLean Elder


Điều này tương đương với đường dẫn của tập lệnh:

%~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 kịch bản lệnh.

Nếu tập lệnh của bạn được lưu trữ tại C:\example\script.bat, sau đó %~dp0 đánh giá 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 thích hợp:

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

[...]

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

[...]

% ~ d1 Mở rộng% 1 chỉ với ký tự ổ - C:

[...]

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

[...]

Các công cụ sửa đổi ở trên có thể được kết hợp:

% ~ dp1 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 tập lệnh lô bằng% 0, các tiện ích mở rộng tham số có thể được áp dụng cho điều này vì vậy% ~ dp0 sẽ trả về Drive và Đường dẫn cho tập lệnh theo lô, ví dụ: W: \ scripts \


138
2017-09-24 21:38



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 chắn nếu nó là một lỗi / lỗi trong văn bản trích dẫn, nhưng trong kịch bản của tôi tôi cần "% ~ d0" để có được tên ổ đĩa! % ~ d1 trống trong trường hợp của tôi. - eftokay83
Trong mắt / hoàn cảnh của tôi, điều này vượt trội hơn câu trả lời được chấp nhận. Nếu bạn chạy một dòng lệnh script "as Administrator" (kích chuột phải vào nó), script 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 cho bạn Windows \ system32 một lần nữa. I E. Câu trả lời này giúp bạn khắc phục điều đó, bạn bắt đầu tập lệnh của mình bằng cd% ~ dp0 - Jaroslav Záruba


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

pushd %curdir%

Nguồn


1
2017-12-23 17:06