Existe uma maneira de navegar para um programa que está na pasta diferente do diretório pai sem usar o caminho completo?
atm eu tenho um lote aqui:
FOLDER 1\BATCHES\batch1.bat
que usa um programa localizado em:
FOLDER 1\PROGRAMS\pro.exe
e meu lote se parece com isso:
"%SYSTEMDRIVE%\Temp\FOLDER 1\PROGRAMS\pro.exe" --input "%SYSTEMDRIVE%\Temp\FOLDER 1\SCRIPT\script.srpt" --output "%SYSTEMDRIVE%\Temp\FOLDER 1\FILES\myfile.x"
como você pode ver o seu bloqueado para um lugar com %SYSTEMDRIVE%\Temp\
então, para tornar meu script "portátil", há algo que eu possa substituir %SYSTEMDRIVE%\Temp\
?
ou colocá-lo em outras palavras: eu gostaria de deixar cair todas as ocorrências de %SYSTEMDRIVE%\Temp\
do meu lote e substituí-lo com algo de uma forma que se eu mover o meu PASTA 1 em qualquer lugar no meu PC, ele será executado
windows
command-line
batch
cmd.exe
command-line-arguments
user902300
fonte
fonte
..\BATCHES\batch1.bat
Respostas:
%~dp0
(com uma barra invertida)..
significando um nível acima.Em um
tree A: /F
como isso:Este lote:
terá esta saída:
fonte
%~dp0
parte com todofor %%A in (".... ... Set_
parte necessária e por quê? Eu tentei apenas com isso:"..\\PROGRAMS\pro.exe" --input "..\\SCRIPT\script.srpt" --output "..\\FILES\myfile.x"
e lote executa tudo como deveriafor
é usado apenas para resolver a expressão dentro das aspas duplas, também funcionaria diretamente, mas é menos claro:A:\FOLDER 1\BATCHES\..\PROGRAMS\pro.exe
no meu exemplo.%~dp0
de uma forma ou de outra, então minha pergunta era mais sobre: é uma maneira de escolher usar%~dp0
ou perco algum benefício se eu for sem ele, apenas e somente com"..\\PROGRAMS\pro.exe" --input "..\\SCRIPT\script.srpt" --output "..\\FILES\myfile.x"
e nada mais"..\PROGRAMS\pro.exe" --input "..\SCRIPT\script.srpt" --output "..\FILES\myfile.x"
poderia se referir ao diretório atual%CD%
que não é necessariamente o mesmo que o caminho do lote.C:\Users\UserName>
todas as ações sem outro caminho expresso ocorrem nesta pasta. Se você invocar um lote com um caminho comoC:\Temp\FOLDER 1\BATCHES\batch1.bat
o diretório atual permanece o mesmoC:\Users\UserName
portanto, um caminho relativo será relativo à pasta atual e não à pasta em que o lote reside.Vamos considerar o seguinte cenário:
Então, use
%~dp0
link relativo ao script em lote e..
caminho relativo para o diretório pai como no script a seguir:Saída :
Nota naquela
%~dp0..\PROGRAMS
difere de..\PROGRAMS
geralmente:%~dp0..\PROGRAMS
é o caminho relativo ao diretório em que o lote resided:\temp\FOLDER 1\BATCHES\
no exemplo acima)..\PROGRAMS
é um caminho relativo ao diretório atual em que o lote foi iniciadod:\bat\
no exemplo acima)fonte
%~dp0
parte com todoSETLOCAL EnableExtensions ... dir /B /S "%PathToBatch%" ... dir /B /S "%PathToBatch%..\programs"
parte necessária e por quê? Eu tentei apenas com isso:"..\\PROGRAMS\pro.exe" --input "..\\SCRIPT\script.srpt" --output "..\\FILES\myfile.x"
e lote executa tudo como deveriaset "PathToBatch=%~dp0"
(qual estava lá no script durante a depuração). Responda atualizado."%~dp0..\\FILES\myfile.x"
e"..\\FILES\myfile.x"
? E porque eu precisodir /B /S
?dir /B /S "%~dp0..\programs"
meramente para mostrar resultado de usar..
em uma especificação de caminho. O SuperUser não é um serviço de script gratuito, então você não pode esperar uma solução infalível.