Đầ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.bat
bó 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?
Đầ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.bat
bó 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?
Câu trả lời:
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 %~dp0
sẽ trả lại Drive và Path cho tập lệnh bó (ví dụ W:\scripts\
) và %~f0
sẽ 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 %0
sẽ 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 %0
biến được mở rộng, kết quả được đặt trong dấu ngoặc kép.
stm.sql
vào D:\Dir1\Dir2\stm.sql
. Tôi cần mysql.exe -u root -p mysql < %cd%\stm.sql
phải thực thi các lệnh stm.sql đó.
*.bat
hay *.sh
?
D:\Dir1\Dir2\batchfile.bat
và D:\Dir1\Dir2\stm.sql
. Nội dung batchfile.bat là: mysql.exe -u root -p mysql < D:\Dir1\Dir2\stm.sql
và nội dung stm.sql là một số lệnh MySQL.
echo %~dp0
sẽ trở lại đường dẫn đến vị trí hàng loạt. echo %~f0
sẽ trả về đường dẫn đến lô có tên tệp.
Rất đơn giản:
setlocal
cd /d %~dp0
File.exe
cd /d %~dp0
như dòng đầu tiên của tệp bó và hoạt động
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 .bat
tệp. Để xác minh đường dẫn là chính xác:
@echo %mypath%
Ví dụ: một tệp được gọi DIR.bat
với nội dung sau
set mypath=%cd%
@echo %mypath%
Pause
chạy từ thư mục g:\test\bat
sẽ lặp lại đường dẫn đó trong cửa sổ lệnh DOS.
Đâ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.
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
.