Thêm một thư mục và tất cả các thư mục con vào biến PATH với một mục nhập duy nhất


19

Tôi đã có một thư mục trong thư mục nhà của tôi, trong đó tôi đặt phần mềm dòng lệnh (CMD_Software). Tôi đặt từng phần mềm vào thư mục riêng của nó trong CMD_Software để tránh lộn xộn.

Tôi muốn tạo một mục duy nhất trong biến PATH của mình để cho phép truy cập vào CMD_Software và tất cả các thư mục chứa trong dòng lệnh.

Tôi đã cố gắng C:\Users\myuser\CMD_Software\*nhưng điều đó không làm được gì. Đó là điểm mà tôi hết ý tưởng.

Xin lưu ý rằng tôi không cố thiết lập một đường dẫn mới khi ở trong thiết bị đầu cuối, tôi đang cố gắng thiết lập một đường dẫn mới trong "Biến môi trường" có sẵn trên tab "Nâng cao" của Thuộc tính hệ thống.


Bạn đã thử một cái gì đó như `C: \ Users \ myuser \ CMD_Software *`?
terdon

4
Tôi không nghĩ rằng điều này là có thể.
Harry Johnston

Câu trả lời:


16

Biến PATH không hỗ trợ ký tự đại diện hoặc đệ quy. Đây là do thiết kế.

Có hai cách giải quyết có thể mà tôi đã sử dụng trong dịp này:

  • Tạo một thư mục với các tệp bó đơn giản và thêm thư mục đó vào PATH. Mỗi tệp bó có thể khởi chạy chương trình bạn muốn, ví dụ:

    :: CMD_Software.bat: start CMD_Software
    @C:\Users\myuser\CMD_Software\CMD_Software.exe %*
    

    Dòng đầu tiên là một nhận xét, dòng thứ hai bắt đầu @để tránh hiển thị lệnh đang được chạy và %*được sử dụng để truyền bất kỳ đối số dòng lệnh nào cho EXE.

  • Thêm bí danh vào CMD.EXE:

    DOSKEY CMD_Software="C:\Users\myuser\CMD_Software\CMD_Software.exe" $*
    

    Điều này về cơ bản dịch CMD_Softwaretrong dấu nhắc lệnh cho mọi thứ sau dấu bằng. Nó $*được thay thế bằng các đối số được cung cấp.

Tôi thích cách tiếp cận thứ hai, bởi vì bạn có thể nhóm tất cả các bí danh trong một tệp duy nhất (xem công tắc "/ MACROFILE" trong DOSKEY /?) Và để nó tự động chạy bất cứ khi nào trình thông dịch lệnh bắt đầu sử dụng cài đặt đăng ký (xem khóa "AutoRun" trong CMD /?).

Một nhược điểm của phương thức thứ hai là các bí danh chỉ hoạt động khi bắt đầu một dòng lệnh. Đây có thể là một vấn đề nếu bạn muốn xâu chuỗi các lệnh. Ví dụ: CLS & CMD_Softwaresẽ không hoạt động trừ khi bạn đặt bí danh vào một dòng riêng bằng cách sử dụng dấu ngoặc đơn:

CLS & (
CMD_Software
)

Bất cứ khi nào điều này trở thành một vấn đề, tôi chỉ dự phòng cho cách tiếp cận tập tin hàng loạt.


Cảm ơn! Phương pháp đầu tiên hoạt động thực sự tốt đối với tôi, chủ yếu là vì tôi không phải làm phiền với registry khi tôi chuyển dữ liệu giữa các máy tính. Nó cũng khá gọn gàng và tiện lợi vì bạn chỉ mất thêm một chút thời gian để tạo một tập tin bat khi bạn nhận được tiện ích nói.
cyqsimon

Thật không may, tôi phải làm lại tuyên bố trước đây của tôi một cách nhanh chóng. Tôi đã gặp phải các vấn đề lạ với các tập lệnh thoát ngẫu nhiên một nửa trong khi thực hiện sau khi áp dụng phương thức đầu tiên. Cụ thể, wget cho Windows dường như rất thích giết chết tập lệnh của tôi sau khi tải xuống xong. Tôi đã lãng phí hai giờ qua để khắc phục sự cố kịch bản của mình một cách đau đớn, nhưng cuối cùng tôi đã cố gắng ném tất cả các exes vào một thư mục gốc duy nhất, và tất cả các vấn đề đều biến mất. Vì vậy, tôi sẽ khuyên bạn nên thận trọng trước khi bất cứ ai đi sâu vào phương pháp này.
cyqsimon

4

Đây là những gì tôi sử dụng để khắc phục vấn đề. Sao chép tập lệnh này bên dưới và lưu nó FIXPATH.BATvào thư mục mà bạn đã thêm vào PATHbiến môi trường. Ví dụ:

C: \ Người dùng \ myuser \ CMD_Software \

Bây giờ bất cứ khi nào bạn cần chạy một chương trình trong thư mục con, hãy nói ...

C: \ Users \ myuser \ CMD_Software \ unixutils \ grep.exe
hoặc là
C: \ Users \ myuser \ CMD_Software \ fantetools \ exiftool.exe

Chạy fixpathtrước rồi nhập lệnh (vd grephoặc exiftool) như vậy:

Microsoft Windows [Phiên bản 6.3.9600]
(c) 2013 Tập đoàn Microsoft. Đã đăng ký Bản quyền.

C: \ Users \ myuser> fixpath
C: \ Users \ myuser> exiftool


FIXPATH.BAT

setlocal EnableDelayedExpansion
cd / D% ~ dp0

cho / R %% d trong (.) làm (
    đặt "dirs =! dirs !; %% d"
)

đường dẫn =% đường dẫn%! dirs!
(nội địa
    đặt "ret =% PATH%"
)
cmd / K "title [#] Đường dẫn cố định [#] && đường dẫn% ret%"
lối ra / B

Cảm ơn câu trả lời của @ VonC


1

Đặt thư mục con "chương trình liên kết \" bên dưới ... \ CMD_Software (hoặc bất cứ nơi nào, thực tế) và điền vào đó bằng các liên kết tượng trưng hoặc liên kết cứng cho mỗi tệp thực thi mà bạn muốn truy cập. Sau đó, một mục duy nhất trong PATH cho ... \ chương trình liên kết sẽ đủ.


1
Vấn đề chính với điều đó là nếu có bất kỳ thư viện nào mà tệp thực thi phụ thuộc vào khả năng nằm trong cùng thư mục với exe, chúng sẽ không được sử dụng. Hoặc ít nhất đó là những gì đang xảy ra với nỗ lực của tôi với điều này.
zero298

Nhận xét tuyệt vời, @ zero298. Mặc dù tôi muốn, nếu bất cứ ai chắc chắn 100% và có thể xác nhận điều này thực sự đúng để vui lòng bấm chuông. (Vì phương pháp này là cách sạch nhất tuyệt đối.)
Henrik

-1

Nếu bạn không quá bận tâm về ý tưởng, bạn có thể sao chép các công cụ dòng lệnh của mình vào thư mục Windows \ System32. Sau đó, bạn có thể chạy chúng từ bất kỳ thư mục nào, giống như ping hoặc ipconfig.

chỉnh sửa
Sau một chút mày mò xung quanh, điều này là có thể. Bạn chỉ cần sử dụng dấu chấm phẩy để phân định các thư mục của bạn. Giả sử bạn đã có một chương trình trong "thư mục1" và "thư mục 2". Bạn sẽ viết con đường của bạn như thế này:

c:\folder1\;c:\folder2\;c:\folder3\;    etc....

Sau đó, bạn có thể gọi một chương trình trong một trong hai thư mục trực tiếp từ dòng lệnh. AFAIK không có cách nào khác để làm điều này chỉ với một dòng duy nhất.

Thông tin hỗ trợ: http://en.wikipedia.org/wiki/PATH_(variable)


1
Điều này không có nhiều ý nghĩa. 1. Điều này sẽ xóa bất kỳ nội dung trước đó của biến PATH . 2. Biến PATH sẽ chỉ chứa thư mục, không chứa thư mục con của nó (kết quả mong muốn). 3. Gọi program.batnhư %PATH%\program.batlà ít nhiều trái ngược với những gì PATH được thiết kế cho.
Dennis
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.