Nhận thư mục batchfile hiện tại


283

Đầu tiên, tôi thấy chủ đề này nhưng tôi không thể hiểu điều đó.

Câu hỏi:

Có một tệp D:\path\to\file.batbó với nội dung sau:

echo %cd%
pause

Đầu ra là:

C:\

Nó phải là D:\path\to

Tôi đang làm gì sai?


7
Bạn nên đọc tất cả các câu trả lời cho một câu hỏi, đặc biệt là những người bỏ phiếu cao hơn, không chỉ câu trả lời được chấp nhận. Câu trả lời với số điểm cao nhất tại liên kết được đăng của bạn đã trả lời câu hỏi của bạn.
dbenham

4
Nếu bạn đang ở c: \ khi bạn nhập tên tệp bó thì c: \ là những gì% cd% sẽ in.
foxidrive

Câu trả lời:


496

Biến chỉ đọc hệ thống %CD%giữ đường dẫn của người gọi lô, không phải vị trí tệp bó.

Bạn có thể lấy tên của tập lệnh bó do người dùng nhập vào %0(ví dụ scripts\mybatch.bat). Các phần mở rộng tham số có thể được áp dụng cho điều này vì vậy %~dp0sẽ trả lại Drive và Path cho tập lệnh bó (ví dụ W:\scripts\) và %~f0sẽ trả về tên đường dẫn đầy đủ (ví dụ W:\scripts\mybatch.cmd).

Bạn có thể tham khảo các tệp khác trong cùng thư mục với tập lệnh bó bằng cách sử dụng cú pháp này:

CALL %0\..\SecondBatch.cmd

Điều này thậm chí có thể được sử dụng trong một chương trình con, Echo %0sẽ cung cấp nhãn cuộc gọi, nhưng echo "%~nx0"sẽ cung cấp cho bạn tên tệp của tập lệnh bó.

Khi %0biến được mở rộng, kết quả được đặt trong dấu ngoặc kép.

Thêm về các thông số lô .


1
Hãy nhìn xem, tôi không cần phải chạy stm.sqlvào D:\Dir1\Dir2\stm.sql. Tôi cần mysql.exe -u root -p mysql < %cd%\stm.sqlphải thực thi các lệnh stm.sql đó.
Hamed Kamrava

@HamedKamrava là nó cho lô SQL của tôi? không tập tin thực thi như thế *.bathay *.sh?
Stoleg

@ Stoleg- Trên thực tế, có 2 tệp trong D:\Dir1\Dir2\batchfile.batD:\Dir1\Dir2\stm.sql. Nội dung batchfile.bat là: mysql.exe -u root -p mysql < D:\Dir1\Dir2\stm.sqlvà nội dung stm.sql là một số lệnh MySQL.
Hamed Kamrava

1
Biến chỉ đọc hệ thống% CD% giữ đường dẫn của người gọi lô, không phải vị trí tệp bó.
Stoleg

34
echo %~dp0sẽ trở lại đường dẫn đến vị trí hàng loạt. echo %~f0sẽ trả về đường dẫn đến lô có tên tệp.
Stoleg

119

Rất đơn giản:

setlocal
cd /d %~dp0
File.exe

9
Mã này ngắn nhưng không đơn giản để hiểu. File.exe này là gì? Là đường dẫn thư mục hiện tại được lưu trữ trong% ~ dp0?
Ivailo Bardarov

Câu trả lời này thực sự trả lời câu hỏi, tôi nghĩ. Thanh danh.
macetway

3
Tôi chỉ sử dụng cd /d %~dp0như dòng đầu tiên của tệp bó và hoạt động
mkb

Tại sao cần setlocal? Nó cũng trở lại tốt mà không có điều đó?
T.Todua

1
@ T.Todua "setlocal" gây ra bất kỳ thay đổi môi trường nào, bao gồm cả thư mục hiện tại được chứa cho đến khi tệp bó kết thúc hoặc gặp phải "endlocal". Nếu bạn sẽ thay đổi các biến môi trường hoặc thư mục hiện tại, thì đó là hình thức tốt.
Jamie

30

Trong tệp .bat của bạn:

set mypath=%cd%

Bây giờ bạn có thể sử dụng biến %mypath%để tham chiếu đường dẫn tệp đến .battệp. Để xác minh đường dẫn là chính xác:

@echo %mypath%

Ví dụ: một tệp được gọi DIR.batvới nội dung sau

set mypath=%cd%
@echo %mypath%
Pause

chạy từ thư mục g:\test\batsẽ lặp lại đường dẫn đó trong cửa sổ lệnh DOS.


1
đây là giải pháp tốt nhất và đơn giản nhất
Nani

7
Đây không phải là một giải pháp tốt vì nó không tính đến tập lệnh bó được gọi từ một tệp khác trên một đường dẫn khác.
theQuestionMan

cũng như khi chạy dưới quyền nâng cao,% cd% trả về C: \ Windows \ system32 nhưng không phải là thư mục nơi nó được lưu trữ.
PravyNandas

9

Đây là những gì tôi sử dụng ở đầu tất cả các tệp bó của tôi. Tôi chỉ cần sao chép / dán từ thư mục mẫu của tôi.

@echo off
:: --HAS ENDING BACKSLASH
set batdir=%~dp0
:: --MISSING ENDING BACKSLASH
:: set batdir=%CD%
pushd "%batdir%"

Đặt đường dẫn của tệp bó hiện tại thành% batdir% cho phép bạn gọi nó trong các stmts tiếp theo trong tệp bó hiện tại, bất kể tệp bó này thay đổi ở đâu. Sử dụng PUSHD cho phép bạn sử dụng POPD để nhanh chóng đặt đường dẫn của tệp bó này thành% batdir% ban đầu. Hãy nhớ rằng, nếu sử dụng% batdir% ExtraDir hoặc% batdir% \ ExtraDir (tùy thuộc vào phiên bản nào được sử dụng ở trên, kết thúc dấu gạch chéo ngược hay không), bạn sẽ cần đặt toàn bộ chuỗi trong dấu ngoặc kép nếu đường dẫn có khoảng trắng (ví dụ: "% batdir% ExtraDir" ). Bạn luôn có thể sử dụng PUSHD% ~ dp0. [https: // ss64.com/ nt / cú pháp-args .html] có nhiều thông số hơn (% ~).

Lưu ý rằng việc sử dụng (: :) ở đầu một dòng làm cho nó trở thành một dòng bình luận. Quan trọng hơn, sử dụng :: cho phép bạn bao gồm các chuyển hướng, đường ống, ký tự đặc biệt (tức là <> | vv) trong nhận xét đó.

:: ORIG STMT WAS: dir *.* | find /v "1917" > outfile.txt

Tất nhiên, Powershell làm điều này và nhiều hơn nữa.


2
Câu trả lời tuyệt vời, cảm ơn rất nhiều! :-) Chỉ cần cẩn thận kỹ thuật thứ hai của bạn ( set batdir=%CD%). Nó không ổn, bởi vì nó là đường dẫn đến người gọi, không phải là tập tin bat. Cách hợp lệ duy nhất để có được đường dẫn đến tệp bat thực thi là %~dp0.
Mitch McMabers
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.