2009-03-23 52 views
58

Tôi có tệp lô nằm trong thư mục và phải được chạy từ đó vì nó cập nhật tệp trong thư mục này.
Điều này hoạt động hoàn toàn tốt, ngoại trừ khi người dùng chạy tệp bó với tư cách quản trị viên (bắt buộc trên Vista). Sau đó thư mục khởi động là C: \ Windows \ System32.

Có cách nào để vẫn có thể biết được từ thư mục nào tập tin thực thi được chạy?
Tôi không muốn người dùng nhập thư mục theo cách thủ công.Thư mục bắt đầu của loạt tệp Windows khi 'chạy dưới dạng quản trị viên'

Trả lời

77

Hãy thử truy cập đường dẫn file thực thi như thế này:

echo %~dp0 

Để biết thêm thông tin, xem đoạn trích sau đây từ lệnh for /? mô tả cách lệnh công trình trên:

 
You can now use the following optional syntax: 

    %~I   - expands %I removing any surrounding quotes (") 
    %~fI  - expands %I to a fully qualified path name 
    %~dI  - expands %I to a drive letter only 
    %~pI  - expands %I to a path only 
    %~nI  - expands %I to a file name only 
    %~xI  - expands %I to a file extension only 
    %~sI  - expanded path contains short names only 
    %~aI  - expands %I to file attributes of file 
    %~tI  - expands %I to date/time of file 
    %~zI  - expands %I to size of file 
    %~$PATH:I - searches the directories listed in the PATH 
        environment variable and expands %I to the 
        fully qualified name of the first one found. 
        If the environment variable name is not 
        defined or the file is not found by the 
        search, then this modifier expands to the 
        empty string 

The modifiers can be combined to get compound results: 

    %~dpI  - expands %I to a drive letter and path only 
    %~nxI  - expands %I to a file name and extension only 
    %~fsI  - expands %I to a full path name with short names only 
    %~dp$PATH:I - searches the directories listed in the PATH 
        environment variable for %I and expands to the 
        drive letter and path of the first one found. 
    %~ftzaI  - expands %I to a DIR like output line 
+0

Fantastic , Tôi không biết cái này. Cảm ơn rất nhiều – Marc

+0

Làm mờ đến mức nào! Nhưng chính xác những gì tôi cần. Cảm ơn. – stucampbell

+1

@stucampbell thử lệnh 'for /?' để có được một mô tả chi tiết về cách thức hoạt động (di chuyển xuống trang 4) – Martin

0

tôi sử dụng:

cd% 0 ..

khi cầu xin hiệp của tập tin batch để thay đổi thư mục vào thư mục chứa tập tin thực thi được bắt đầu vào

-Mathew

+0

Điều đó sẽ không thay đổi ký tự ổ đĩa. –

30

tốt hơn so với cdpushd

  • thay đổi ký tự ổ đĩa nếu bắt đầu từ D:\...
  • sẽ gán một ký tự ổ đĩa nếu trên một đường dẫn mạng UNC

Vì vậy pushd %~dp0 là tốt.

Thực hành tốt là sau đó gọi popd khi hoàn tất.

+1

+1 để đề cập đến lệnh 'pushd' chưa được biết nhiều nhất. – Martin

+0

hoạt động trong các cửa sổ 8.1 – wiak

+0

Giải pháp tuyệt vời cho các hệ thống có nhiều ổ đĩa và hoạt động trong Windows 7, 8, 8.1 và 10, +1 –

18

này nên giải quyết vấn đề của bạn bằng cách thiết lập thư mục làm việc cho các tập tin thực thi lại vào thư mục hiện:

Bao gồm hai dòng sau ở phía trên cùng của kịch bản .bat của bạn:

@setlocal enableextensions 
@cd /d "%~dp0" 

Tìm thấy tại : http://www.codeproject.com/Tips/119828/Running-a-bat-file-as-administrator-Correcting-cur

+1

Điều này là hoàn hảo. Giải quyết vấn đề "không tìm thấy tệp" của tôi khi chạy tệp bat làm quản trị viên. – pandalion98

0

Bạn có thể CD trực tiếp từ tên tệp bằng cách thêm phụ huynh (không được kiểm tra trong cửa sổ 8.x, nhưng đã làm việc "mãi mãi" theo như tôi có thể nhớ).

CD %FILENAME%\.. 

và CD sẽ thay đổi ổ đĩa cũng như/D, được hiển thị ở trên nhưng không được đề cập rõ ràng để có thể bỏ qua. CD/D% FILENAME% \ ..

(FOR /? NẾU /? SET /? CALL /? GOTO /? tất cả cung cấp đọc rất hữu ích nếu bạn sử dụng cmd.exe, tôi đọc lại chúng một lần trong một thời gian.)

Các vấn đề liên quan