CMD: nối vào đường dẫn mà không nhân đôi nó?


12

Đối với một CMDphiên tôi có thể dễ dàng thiết lập một đường dẫn mới:SET PATH=%PATH%;"insert custom path here"

Làm như vậy trong một tệp bó không xem xét liệu đường dẫn tùy chỉnh đã được bao gồm chưa. Làm cách nào để tránh sao chép nó (tức là kiểm tra xem nó đã được chứa trong "chuỗi" PATH chưa).

Nhận xét:

  1. Liên quan: Làm cách nào để thêm các biến môi trường do người dùng xác định vào biến hệ thống PATH trong Windows 7?
  2. Liên quan: Làm thế nào tôi có thể nối vĩnh viễn một mục vào biến PATH của hệ thống, thông qua dòng lệnh?
  3. Câu hỏi tương tự cho UNIX: Thêm thư mục vào $ PATH nếu nó chưa có
  4. Một số ops "CMD" đã giải thích: http://ss64.com/nt/syntax-replace.html

Cần chỉ ra rằng trong bối cảnh này, sự trùng lặp là vô hại. Có lẽ sẽ hợp lý hơn khi cho phép sự trùng lặp xảy ra hơn là cố gắng tránh nó và đưa ra nguy cơ dương tính giả.
Harry Johnston

Câu trả lời:


14

Tương tự như câu trả lời của MaddHackers, chỉ cần gọn hơn.
echo %path%|find /i "%np%">nul || set path=%path%;%np%

%np%là con đường mới của bạn, tất nhiên bạn có thể sử dụng nghĩa đen thay thế. Nó làm gì: echo %path%|find /i "%np%">nultìm kiếm đường dẫn hiện có cho một chuỗi, loại bỏ đầu ra. ||có nghĩa là thực thi khi thất bại, vì vậy nó có nghĩa là: Đường dẫn tìm kiếm chuỗi được thêm vào và nếu không tìm thấy, hãy thêm nó.

Chỉnh sửa: Nói chung, không bắt buộc phải trích dẫn các đường dẫn, ngay cả những khoảng trắng chứa, nhưng nếu bạn muốn trích dẫn chúng , phiên bản này sẽ hoạt động với các đường dẫn được trích dẫn kép:
echo %path%|find /i "%np:"=%">nul || set path=%path%;%np%

Chỉnh sửa: thay đổi findstr /i /c:để find /inhư findstrcó thể hiểu sai một số trình tự như ghi nhận của KubaOber trong ý kiến


Thật tuyệt, tôi biết có một cách sạch hơn để làm điều đó ... vẫn thích bash hơn, nhưng đó chỉ là tôi: D Cảm ơn vì sự giúp đỡ!
MaddHacker

Đẹp, nhưng nó làm việc với không gian trong đường dẫn? Tôi đã thử nghiệm nó với các đường dẫn cụ thể của mình, một đường dẫn "được trích dẫn và có khoảng trắng" được thêm lại. Một chỉ trích dẫn nhưng dường như không có không gian làm việc.
Horst Walter

1
@HorstWalter Có, nó sẽ hoạt động với bất kỳ đường dẫn nào (Tôi vừa kiểm tra với một số khoảng trắng). Bạn có ý nghĩa gì khi "trích dẫn"? Bạn không cần phải sử dụng dấu ngoặc kép trong đường dẫn, ngay cả những dấu cách chứa khoảng trắng. Nếu %np%dấu ngoặc kép của bạn chứa - có, nó sẽ khiến nó hoạt động sai.
wmz

2
@HorstWalter Xem chỉnh sửa của tôi. Đây chỉ là một vấn đề nếu bạn sử dụng biến, sử dụng chữ (như trong echo %path%|findstr /i /c:"my path">nul || set path=%path%;"my path") sẽ hoạt động tốt.
wmz

1
@wmz echo d\. | findstr /c:"d\."thất bại, nhưng echo d\. | find "d\."thành công
Phục hồi lại

4

Tôi biết nó bẩn, nhưng điều này sẽ làm việc:

 SET PATH=$(echo $PATH | awk -F"%checkstr%" '{ print ($(NF-1) ~ 0) ? $PATH:%newpath% : $PATH; }')

Đâu %checkstr%là chuỗi cần kiểm tra trong PATH và %newpath%là PATH mới để nối với PATH hiện tại

Hy vọng điều đó có ích, và tôi chắc chắn có một cách dễ dàng hơn, nhưng bây giờ nên thực hiện thủ thuật này.

BIÊN TẬP

Vì vậy, nếu bạn không muốn thêm các công cụ UNIX vào Windows, bạn có thể thử cú pháp lô này:

echo %PATH% | find /C /I "<string to find>" > out.txt 
set /p dne= < out.txt
if 0 EQU %dne% (set PATH=%PATH%;"<custom path>")
del out.txt

Ugh, không phải bất kỳ trình duyệt nào đẹp hơn và có thể được thực hiện dưới dạng một dòng nếu bạn có thể nhận lệnh tìm đường ống để làm việc như một tiểu ban trong câu lệnh if ...


2

Kịch bản dựa trên câu trả lời của "wmz":

@ECHO off
ECHO java_home=%JAVA_HOME%
SET javapath=%JAVA_HOME%\bin
ECHO %path%|findstr /i /c:"%javapath:"=%">nul || set path=%path%;%javapath%
ECHO Path=%path%
PAUSE
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.