CMD: anexar ao caminho sem duplicá-lo?

12

Para uma CMDsessão, posso definir facilmente um novo caminho:SET PATH=%PATH%;"insert custom path here"

Fazer isso em um arquivo em lotes não considera se o caminho personalizado já está incluído. Como evito duplicá-lo (por exemplo, verifique se ele já está contido na "string" PATH).

Observações:

  1. Relacionado: Como anexar variáveis ​​de ambiente definidas pelo usuário à variável de sistema PATH no Windows 7?
  2. Relacionado: Como anexar permanentemente uma entrada na variável PATH do sistema, via linha de comando?
  3. Mesma pergunta para UNIX: Adicione o diretório ao $ PATH se ele ainda não estiver lá
  4. Algumas operações de string "CMD" explicadas: http://ss64.com/nt/syntax-replace.html
Horst Walter
fonte
Cabe ressaltar que, nesse contexto, a duplicação é inofensiva. Provavelmente seria mais sensato permitir que a duplicação ocorra do que tentar evitá-la e introduzir o risco de um falso positivo.
Harry Johnston

Respostas:

14

Semelhante à resposta do MaddHackers, apenas mais compacta.
echo %path%|find /i "%np%">nul || set path=%path%;%np%

%np%é o seu novo caminho, é claro que você pode usar literais. O que faz: echo %path%|find /i "%np%">nulpesquisa o caminho existente por uma sequência, descartando a saída. ||significa executar em caso de falha, o que significa: Caminho de pesquisa para a sequência a ser adicionada e, se não for encontrada, adicione-a.

Edit: Geralmente não é necessário citar caminhos, mesmo aqueles que contenham espaços, mas se você quiser citá-los , esta versão funcionará com caminhos com aspas duplas:
echo %path%|find /i "%np:"=%">nul || set path=%path%;%np%

Editar: alterado findstr /i /c:para, find /ipois findstrpode interpretar erroneamente algumas seqüências, conforme observado pelo KubaOber nos comentários

wmz
fonte
Bom, eu sabia que havia uma maneira mais limpa de fazer isso ... ainda prefere o bash, mas sou apenas eu: D Obrigado pela ajuda!
MaddHacker
Bom, mas funciona com espaços no caminho? Eu testei com meus caminhos particulares, o "citado e com espaços" é adicionado novamente. Um acabou de citar, mas nenhum espaço parece funcionar.
Horst Walter
11
@HorstWalter Sim, ele deve funcionar com qualquer caminho (acabei de verificar com alguns espaços incluindo). O que você quer dizer com "citado"? Você não precisa usar aspas nos caminhos, mesmo aqueles que contêm espaços. Se você %np%contiver aspas - sim, fará com que ele se comporte mal.
Wmz
2
@HorstWalter Veja minha edição. Este é apenas um problema se você usar variável, o uso de literais (como em echo %path%|findstr /i /c:"my path">nul || set path=%path%;"my path") deve funcionar bem.
Wmz
11
@wmz echo d\. | findstr /c:"d\."falha, mas echo d\. | find "d\."é bem
Reinstate Monica
4

Eu sei que está sujo, mas isso deve funcionar:

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

onde %checkstr%é a string a ser procurada no PATH e %newpath%é o novo PATH a ser anexado ao PATH atual

Espero que ajude, e tenho certeza de que há uma maneira mais fácil, mas isso deve funcionar por enquanto.

EDITAR

Portanto, se você não deseja adicionar as ferramentas UNIX ao Windows, tente esta sintaxe em lote:

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, não é mais bonito, e pode ser feito como uma linha, se você puder obter o comando find'ed pipe para funcionar como um subcomando na instrução if ...

MaddHacker
fonte
2

Script baseado na resposta de "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
djangofan
fonte