CMD: Anexar ao caminho sem duplicá-lo?

CMD: Anexar ao caminho sem duplicá-lo?

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

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

Observações:

  1. Relacionado:Como acrescento variáveis ​​de ambiente definidas pelo usuário à variável de sistema PATH no Windows 7?
  2. Relacionado:Como posso 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 ainda não estiver lá
  4. Algumas operações de String "CMD" explicadas:http://ss64.com/nt/syntax-replace.html

Responder1

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 em busca de uma string, descartando a saída. ||significa executar em caso de falha, então significa: Procure o caminho da string a ser adicionada e, se não for encontrada, adicione-a.

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

Editar: alterado findstr /i /c:para find /ipode findstrinterpretar mal algumas sequências, conforme observado por KubaOber nos comentários

Responder2

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%está a string a ser verificada 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 não quiser adicionar as ferramentas UNIX ao Windows, você pode tentar 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ê conseguir que o comando find pipe'ed funcione como um subcomando na instrução if ...

Responder3

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

Responder4

Resposta atualizada para 2021:

setnão está mais funcionando e precisamos usar setx(sintaxe um pouco diferente):

SET mypath=C:\dev\vendor\sass\1.32.4
ECHO %Path%|findstr /i /c:"%mypath:"=%">nul || setx Path "%Path%";%mypath%

informação relacionada