CMD : 복제하지 않고 경로에 추가 하시겠습니까?


12

CMD세션 동안 새로운 경로를 쉽게 설정할 수 있습니다.SET PATH=%PATH%;"insert custom path here"

배치 파일에서 그렇게하면 사용자 정의 경로가 이미 포함되어 있는지 고려하지 않습니다. 중복을 피하는 방법 (예 : PATH "string"에 이미 포함되어 있는지 확인)

비고 :

  1. 관련 : Windows 7에서 시스템 변수 PATH에 사용자 정의 환경 변수를 어떻게 추가합니까?
  2. 관련 : 어떻게 영구적으로 명령 줄을 통해 시스템의 PATH 변수에 항목을 추가 할 수 있습니다?
  3. UNIX와 동일한 질문 : $ PATH에 디렉토리를 추가하십시오 (없는 경우)
  4. "CMD"String ops에 대한 설명 : http://ss64.com/nt/syntax-replace.html

이러한 맥락에서, 복제는 무해하다는 것을 지적해야한다. 중복을 피하고 허위 긍정의 위험을 유발하는 것보다 복제가 발생하는 것이 더 합리적 일 것입니다.
Harry Johnston

답변:


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에 의해 언급 된 몇 가지 시퀀스를 잘못 해석 할 수있다


니스, 나는 그것을 할 수있는 더 깨끗한 방법이 있다는 것을 알았습니다 ... 여전히 bash를 선호하지만 그건 나뿐입니다 : 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\."성공합니다
복원 Monica 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.