Inclua um diretório e todos os subdiretórios na variável PATH com uma única entrada

19

Eu tenho um diretório na minha pasta pessoal na qual coloco o software de linha de comando (CMD_Software). Coloquei cada pedaço de software em seu próprio diretório no CMD_Software para evitar confusão.

Eu gostaria de fazer uma única entrada na minha variável PATH que permita o acesso ao CMD_Software e a todos os diretórios que ela contém na linha de comando.

Eu tentei, C:\Users\myuser\CMD_Software\*mas isso não fez nada. Foi nesse ponto que fiquei sem ideias.

Observe que não estou tentando definir um novo caminho enquanto estiver no terminal. Estou tentando definir um novo caminho nas "Variáveis ​​de ambiente" disponíveis na guia "Avançado" das Propriedades do sistema.

Landon Brainard
fonte
Você tentou algo como `C: \ Users \ myuser \ CMD_Software *`?
terdon
4
Eu não acho que isso seja possível.
Harry Johnston

Respostas:

16

A variável PATH não suporta caracteres curinga ou recursão. Isso é por design.

Existem duas soluções possíveis que eu usei na ocasião:

  • Crie um diretório com arquivos em lote simples e adicione esse diretório ao PATH. Cada arquivo em lote pode iniciar o programa que você deseja, por exemplo:

    :: CMD_Software.bat: start CMD_Software
    @C:\Users\myuser\CMD_Software\CMD_Software.exe %*
    

    A primeira linha é um comentário, a segunda começa com @para evitar mostrar o comando que está sendo executado e %*é usada para passar qualquer argumento de linha de comando para o EXE.

  • Adicione aliases ao CMD.EXE:

    DOSKEY CMD_Software="C:\Users\myuser\CMD_Software\CMD_Software.exe" $*
    

    Isso se traduz essencialmente CMD_Softwareno prompt de comando para tudo após o sinal de igual. O $*é substituído pelos argumentos fornecidos.

Prefiro a segunda abordagem, porque você pode agrupar todos os aliases em um único arquivo (consulte a opção "/ MACROFILE" em DOSKEY /?) E executá-la automaticamente sempre que o interpretador de comandos começar a usar uma configuração de registro (consulte a chave "Execução automática" em CMD /?).

Uma desvantagem do segundo método é que os aliases funcionam apenas no início de uma linha de comando. Isso pode ser um problema se você deseja encadear comandos. Por exemplo, CLS & CMD_Softwarenão funcionará, a menos que você coloque o alias em uma linha separada usando parênteses:

CLS & (
CMD_Software
)

Sempre que isso se torna um problema, eu apenas recorro à abordagem de arquivos em lote.

efotinis
fonte
Obrigado! O primeiro método funciona muito bem para mim, principalmente porque não preciso mexer no registro ao transferir meus dados entre computadores. Também é bastante arrumado e conveniente, pois você só gasta um pouco mais de tempo para criar um arquivo bat quando obtém o referido utilitário.
22619 cyqsimon
Infelizmente, tenho que redigir minha declaração anterior rapidamente. Eu encontrei problemas estranhos com scripts saindo aleatoriamente no meio da execução depois de adotar o primeiro método. Em particular, o wget para Windows parece gostar de matar meu script depois que ele termina o download. Eu perdi as últimas duas horas dolorosamente na solução de problemas do meu script, mas finalmente tentei jogar todos os exes em um único diretório raiz, e os problemas desapareceram. Portanto, eu recomendaria cautela antes que alguém entrasse nesse método.
22419 cyqsimon
4

É isso que eu uso para corrigir o problema. Copie esse script abaixo e salve-o FIXPATH.BATna pasta que você adicionou à PATHvariável de ambiente. Por exemplo:

C: \ Usuários \ meu usuário \ CMD_Software \

Agora, sempre que você precisar executar um programa em uma subpasta, digamos ...

C: \ Usuários \ myuser \ CMD_Software \ unixutils \ grep.exe
ou
C: \ Usuários \ meu usuário \ CMD_Software \ imagetools \ exiftool.exe

Execute fixpathprimeiro e insira o comando (por exemplo, grepou exiftool) da seguinte forma:

Microsoft Windows [Versão 6.3.9600]
(c) 2013 Microsoft Corporation. Todos os direitos reservados.

C: \ Users \ myuser> fixpath
C: \ Users \ myuser> exiftool


FIXPATH.BAT

setlocal EnableDelayedExpansion
cd / D% ~ dp0

para / R %% d em (.) do (
    defina "dirs =! dirs!; %% d"
)

caminho =% caminho%! dirs!
(endlocal
    definir "ret =% PATH%"
)
cmd / K "title [#] Caminho corrigido [#] && path% ret%"
exit / B

Graças à resposta de @ VonC

Vinayak
fonte
1

Coloque um subdiretório "programlinks \" em ... \ CMD_Software (ou em qualquer lugar, na verdade) e preencha-o com links simbólicos ou hardlinks para cada executável que você deseja acessar. Então, uma única entrada no PATH para ... \ programlinks será suficiente.

kreemoweet
fonte
1
O principal problema disso é que, se houver alguma biblioteca da qual o executável dependa potencialmente localizado no mesmo diretório que o exe, elas não serão usadas. Ou pelo menos é o que está acontecendo com a minha tentativa com isso.
zero298
Grande observação, @ zero298. Embora eu gostaria, se alguém está 100% certo e pode confirmar isso é realmente verdade para agradar chime em. (Porque este método é de outra maneira a mais limpa absoluta de tudo.)
Henrik
-1

Se você não se deixar levar pela ideia, poderá copiar suas ferramentas de linha de comando para o diretório Windows \ System32. Então você pode executá-los em qualquer diretório, como ping ou ipconfig.

editar
Depois de alguns ajustes, isso é possível. Você só precisa usar ponto e vírgula para delimitar seus diretórios. Digamos que você tenha um programa em "folder1" e "folder2". Você escreveria seu caminho assim:

c:\folder1\;c:\folder2\;c:\folder3\;    etc....

Em seguida, você pode chamar um programa em qualquer diretório diretamente da linha de comando. AFAIK não há outra maneira de fazer isso com apenas uma linha.

Informações de suporte: http://en.wikipedia.org/wiki/PATH_(variable)

Lee Harrison
fonte
1
Isso não faz muito sentido. 1. Isso apagaria qualquer conteúdo anterior da variável PATH . 2. A variável PATH conteria apenas a pasta, não seus subdiretórios (resultado desejado). 3. Invocar program.batcomo %PATH%\program.baté mais ou menos o oposto do que PATH foi projetado.
Dennis