CMD: ผนวกเข้ากับพา ธ โดยไม่ทำซ้ำหรือไม่


12

สำหรับหนึ่งCMDครั้งฉันสามารถกำหนดเส้นทางใหม่ได้อย่างง่ายดาย:SET PATH=%PATH%;"insert custom path here"

การทำเช่นนี้ในไฟล์แบตช์ไม่ได้พิจารณาว่าพา ธ แบบกำหนดเองนั้นมีอยู่แล้ว ฉันจะหลีกเลี่ยงการทำซ้ำได้อย่างไร (เช่นตรวจสอบว่ามีอยู่แล้วในเส้นทาง "สตริง")

หมายเหตุ:

  1. ที่เกี่ยวข้อง: ฉันจะผนวกตัวแปรสภาพแวดล้อมที่ผู้ใช้กำหนดต่อท้ายตัวแปรระบบ PATH ใน Windows 7 ได้อย่างไร
  2. ที่เกี่ยวข้อง: ฉันจะผนวกรายการในตัวแปร PATH ของระบบอย่างถาวรผ่านทางบรรทัดคำสั่งได้อย่างไร
  3. คำถามเดียวกันสำหรับ UNIX: เพิ่มไดเรกทอรีไปที่ $ PATH หากยังไม่มีอยู่
  4. ops สตริง "CMD" บางตัวอธิบาย: http://ss64.com/nt/syntax-replace.html

มันควรจะชี้ให้เห็นว่าในบริบทนี้การทำสำเนาไม่เป็นอันตราย มันอาจจะมีเหตุผลมากขึ้นที่จะยอมให้การทำซ้ำเกิดขึ้นได้มากกว่าที่จะหลีกเลี่ยงและทำให้เกิดความเสี่ยงในด้านบวกที่ผิดพลาด
แฮร์รี่จอห์นสตัน

คำตอบ:


14

คล้ายกับคำตอบของ MaddHackers กะทัดรัดกว่า
echo %path%|find /i "%np%">nul || set path=%path%;%np%

%np%เป็นเส้นทางใหม่ของคุณแน่นอนคุณสามารถใช้ตัวอักษรแทน ให้ประโยชน์อะไรบ้าง: echo %path%|find /i "%np%">nulค้นหาพา ธ ที่มีอยู่เพื่อค้นหาสตริง ||หมายถึงรันบนความล้มเหลวดังนั้นจึงหมายความว่า: พา ธ การค้นหาเพื่อเพิ่มสตริงและหากไม่พบให้เพิ่มมัน

แก้ไข: โดยทั่วไปไม่จำเป็นต้องอ้างถึงพา ธ แม้จะมีช่องว่างที่เป็นอนิก แต่ถ้าคุณต้องการอ้างถึงเวอร์ชันนี้จะทำงานกับพา ธ ที่ยกมาสองชั้น:
echo %path%|find /i "%np:"=%">nul || set path=%path%;%np%

แก้ไข: เปลี่ยนfindstr /i /c:ไปfind /iเป็นfindstrอาจตีความผิดลำดับบางส่วนเท่าที่สังเกต KubaOber ในความคิดเห็น


ดีฉันรู้ว่ามีวิธีที่สะอาดกว่าในการทำ ... ยังคงชอบทุบตี แต่นั่นเป็นเพียงฉัน: D ขอบคุณสำหรับความช่วยเหลือ!
MaddHacker

ดี แต่ใช้งานได้กับช่องว่างในเส้นทางหรือไม่ ฉันได้ทดสอบกับเส้นทางของฉันโดยเฉพาะอย่างยิ่งหนึ่ง "การอ้างอิงและช่องว่าง" ได้รับการเพิ่มอีกครั้ง เพิ่งยกมาหนึ่งตัว แต่ดูเหมือนว่าจะไม่มีช่องว่าง
Horst Walter

1
@ HorstWalter ใช่มันควรจะทำงานกับเส้นทางใด ๆ (ฉันเพิ่งตรวจสอบกับบางส่วนรวมถึงช่องว่าง) "อ้างถึง" หมายถึงอะไร? คุณไม่จำเป็นต้องใช้เครื่องหมายคำพูดในเส้นทางแม้กระทั่งช่องว่างที่มี หาก%np%ราคาของคุณประกอบด้วย - ใช่มันจะทำให้มันทำงานผิดปกติ
wmz

2
@HorstWalter ดูการแก้ไขของฉัน นี่เป็นปัญหาเฉพาะถ้าคุณใช้ตัวแปรการใช้ตัวอักษร (ตามecho %path%|findstr /i /c:"my path">nul || set path=%path%;"my path") ควรทำงานได้ดี
wmz

1
@wmz echo d\. | findstr /c:"d\."ล้มเหลว แต่echo d\. | find "d\."สำเร็จ
Reinstate Monica

4

ฉันรู้ว่ามันสกปรก แต่สิ่งนี้ควรใช้งานได้:

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

โดยที่%checkstr%เป็นสตริงที่จะตรวจสอบใน PATH และ%newpath%เป็น PATH ใหม่ที่จะผนวกเข้ากับ PATH ปัจจุบัน

หวังว่าจะช่วยได้และฉันแน่ใจว่ามีวิธีที่ง่ายกว่า แต่ตอนนี้ควรทำเคล็ดลับ

แก้ไข

ดังนั้นหากคุณไม่ต้องการเพิ่มเครื่องมือ UNIX ให้กับ Windows คุณสามารถลองใช้ชุดคำสั่งนี้:

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

เอ่อไม่ใช่คนที่น่ารักและสามารถทำได้ในหนึ่งบรรทัดหากคุณสามารถใช้คำสั่ง find ของไปป์เพื่อทำงานเป็นคำสั่งย่อยในคำสั่ง if ...


2

สคริปต์ตามคำตอบโดย "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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.