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


326

Tôi biết rằng %0có chứa đường dẫn đầy đủ của tập lệnh bó, vdc:\path\to\my\file\abc.bat

Tôi sẽ pathbằngc:\path\to\my\file

Làm thế nào tôi có thể đạt được điều đó?




1
BTW:% 0 không chứa đường dẫn đầy đủ nếu bat được gọi với một dòng lệnh tương đối. Vì vậy, "% ~ dpf0" sẽ đáng tin cậy hơn cho trường hợp này.
eckes

Câu trả lời:


560

%~dp0sẽ là thư mục. Đây là một số tài liệu về tất cả các sửa đổi đường dẫn . Công cụ thú vị :-)

Để xóa dấu gạch chéo ngược cuối cùng, bạn có thể sử dụng :n,mcú pháp chuỗi con, như vậy:

SET mypath=%~dp0
echo %mypath:~0,-1%

Thật không may, tôi không tin có cách kết hợp %0cú pháp với :~n,mcú pháp.


7
Tuyệt vời ... Tôi đã sử dụng %~0\..- biết rằng phải có một cách tốt hơn! Ngoài ra, bạn có thể sẽ muốn gửi kèm theo %~dp0dấu ngoặc kép ( "") trong trường hợp có khoảng trắng trong tên thư mục, v.v.
Cameron

1
Đẹp ! Nhưng, %~dp0chứa `` ở cuối. Bạn có một ý tưởng làm thế nào để loại bỏ nó?
Misha Moroshko

1
@Misha: Tôi giả sử bạn có nghĩa là làm thế nào để loại bỏ '\' ở cuối. Tôi đã cập nhật câu trả lời của tôi với các chi tiết.
Dean Harding

2
Ví dụ trong câu trả lời hoạt động tốt mà không có dấu ngoặc kép ngay cả khi có một khoảng trắng trong đường dẫn. (ví dụ SET msg=hello worldhoạt động tốt). Tuy nhiên, khi sử dụng% mypath% ở nơi khác, bạn muốn cẩn thận sử dụng nó trong dấu ngoặc kép, mặc dù chúng không cần thiết cho cdcả hai.
Martin Pain

2
Liên kết đó hiện là 404
StingyJack

12

Bạn có thể sử dụng tập lệnh sau để lấy đường dẫn mà không theo dõi "\"

for %%i in ("%~dp0.") do SET "mypath=%%~fi"

Điều này không xóa tên tệp khỏi đường dẫn mặc dù (ví dụ abc.txt trong ví dụ của OP).
dcp

4
@dcp Er, mặc dù vậy.
Kyle Strand

@Kyle Strand - Vâng, tôi vừa thử lại và bây giờ nó hoạt động tốt. Tôi không chắc điều gì đã xảy ra khi tôi thử nó ban đầu, có lẽ tôi đã mắc lỗi ở đâu đó trong kịch bản. Xin lỗi vì sự nhầm lẫn, và cảm ơn vì đã chỉ ra nó.
dcp

11

%~dp0có thể là một con đường tương đối Để chuyển đổi nó thành một đường dẫn đầy đủ, hãy thử một cái gì đó như thế này:

pushd %~dp0
set script_dir=%CD%
popd

6
Ok, vậy tại sao không sử dụng %~dp0trực tiếp?
jpaugh

5
Một phiên bản tồi tệ hơn của câu trả lời được chấp nhận, được đăng 5 năm sau? Tôi không hiểu
Kyle Strand

Tôi tưởng tượng điều này đã được đăng để giải quyết vấn đề được đề cập trong các nhận xét của câu trả lời được chấp nhận - %~dp0có thể là tương đối, có thể hoặc không phải là vấn đề tùy thuộc vào trường hợp sử dụng
Michael Mrozek

10
%~dp0không thể chứa đường dẫn tương đối, dviết tắt của ổ đĩa và pđường dẫn, làm thế nào một ổ đĩa có thể tương đối?
Jeb

5
Ở thế giới nào? Tôi vừa thử câu trả lời này trên Windows Server 2012 r2 và hóa ra %~dp0nó sẽ là một đường dẫn tuyệt đối ngay cả khi tập lệnh được chạy dưới dạng đường dẫn tương đối. Nhờ bình luận của jeb, tôi không bị lừa bởi câu trả lời này. Tại sao mọi người chỉ trang điểm và đi và bắt đầu truyền bá trí tưởng tượng hoang dã của họ cho người khác. Tôi có đồng nghiệp này làm việc này, nhưng tôi đổ lỗi cho tuổi (trẻ) của anh ấy. Tôi muốn bỏ phiếu của tôi sẽ được tính.
bitoolean

0

Bạn có thể sử dụng %~dp0, d chỉ có nghĩa là ổ đĩa, p chỉ có nghĩa là đường dẫn, 0 là đối số cho tên tệp đầy đủ của tệp bó.

Ví dụ: nếu đường dẫn tệp là C: \ Users \ Oliver \ Desktop \ example.bat thì đối số sẽ bằng C: \ Users \ Oliver \ Desktop \, bạn cũng có thể sử dụng lệnh set cpath=%~dp0 && set cpath=%cpath:~0,-1%và sử dụng %cpath%biến để xóa dấu gạch chéo.


1
Tôi không thể nhìn thấy bất kỳ thông tin hơn, so với 9 năm câu trả lời cũ
Jeb

Thông tin thêm là "d có nghĩa là ổ đĩa, chỉ", v.v ... Cảm ơn bạn, @Hayz.
RJ Dunnill

-2

%cd% sẽ cung cấp cho bạn đường dẫn của thư mục từ nơi tập lệnh đang chạy.

Chỉ cần chạy:

echo %cd%

%CD%là thư mục làm việc hiện tại, không phải thư mục, nơi lưu trữ tệp bó. Họ có thể là cùng một vị trí, nhưng thường thì không.
Stephan

-7

Đó sẽ là %CD%biến.

@echo off
echo %CD%

%CD% trả về thư mục hiện tại tập lệnh bó.


35
% cd% trả về thư mục mà tập lệnh được chạy từ đó, không phải thư mục mà tập lệnh nằm trong.
Misha Moroshko

4
nó chỉ hoạt động nếu tập lệnh của bạn không sửa đổi thư mục làm việc. Hãy thử CD C:\Temp <CR> ECHO %CD%( <CR>là dòng mới ...)
Dean Harding

6
Ngoài ra, nếu bạn nhấp chuột phải vào tập lệnh và chọn "Chạy với tư cách Quản trị viên", thư mục hiện tại bắt đầu là C: \ Windows \ System32 bất kể vị trí của tập lệnh.
Cameron

Mặc dù đây không phải là câu trả lời trực tiếp cho câu hỏi của OP, nhưng hương vị của chức năng này chính xác là thứ tôi đang tìm kiếm khi tìm thấy câu hỏi này. Cảm ơn!
Zoltán

Không có giải pháp nào khác được đăng có vẻ hoạt động với tôi trên Win7 32 bit cmd.exe, điều này ít nhất hữu ích với tôi.
Clifford

-8

Tôi đang làm việc trên máy Windows 7 và cuối cùng tôi đã sử dụng các dòng bên dưới để có được đường dẫn thư mục tuyệt đối cho tập lệnh bash của mình.

Tôi đã nhận được giải pháp này sau khi xem http://www.linuxjournal.com/content/bash-parameter-Exansion .

#Get the full aboslute filename.
filename=$0
#Remove everything after \. An extra \ seems to be necessary to escape something...
folder="${filename%\\*}"
#Echo...
echo $filename
echo $folder

2
OP đang hỏi về các tập lệnh shell Windows BAT / CMD chứ không phải bash.
thủ
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.