como navegar no intervalo da pasta pai sem caminho completo?

0

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

user902300
fonte
..\BATCHES\batch1.bat
Joel Coehoorn

Respostas:

0
  • A pasta em que o lote reside pode ser obtida com %~dp0 (com uma barra invertida)
  • O sistema de arquivos cuida das pastas relativas endereçadas com .. significando um nível acima.

Em um tree A: /F como isso:

A:.
└───Folder 1
    ├───BATCHES
    │       batch1.bat
    │
    ├───FILES
    │       myfile.x
    │
    ├───PROGRAMS
    │       pro.exe
    │
    └───SCRIPT
            script.srpt

Este lote:

:: A:\FOLDER 1\BATCHES\batch1.bat
@Echo off
Echo batch1 folder is: %~dp0
Echo ======================
for %%A in ("%~dp0..\PROGRAMS\pro.exe")   Do set "_Prg=%%~fA"
for %%A in ("%~dp0..\SCRIPT\script.srpt") Do set "_Inp=%%~fA"
for %%A in ("%~dp0..\FILES\myfile.x")     Do set "_Out=%%~fA"
Set _

Echo "%_Prg%" --input "%_Inp%" --output "%_Out%"

terá esta saída:

A:\> "Folder 1\BATCHES\batch1.bat"
batch1 folder is: A:\Folder 1\BATCHES\
======================
_Inp=A:\Folder 1\SCRIPT\script.srpt
_Out=A:\Folder 1\FILES\myfile.x
_Prg=A:\Folder 1\PROGRAMS\pro.exe
"A:\Folder 1\PROGRAMS\pro.exe" --input "A:\Folder 1\SCRIPT\script.srpt" --output "A:\Folder 1\FILES\myfile.x"
LotPings
fonte
se eu posso perguntar, é um %~dp0 parte com todo for %%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 deveria
user902300
o for é 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.
LotPings
o que eu quis dizer foi: sim eu entendo toda a sua resposta / código ... é só que ambas as respostas mencionam o uso de %~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
user902300
Dependendo do contexto "..\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.
LotPings
1
Quando você abre uma janela cmd você vê um prompt como C:\Users\UserName> todas as ações sem outro caminho expresso ocorrem nesta pasta. Se você invocar um lote com um caminho como C:\Temp\FOLDER 1\BATCHES\batch1.bat o diretório atual permanece o mesmo C:\Users\UserName portanto, um caminho relativo será relativo à pasta atual e não à pasta em que o lote reside.
LotPings
0

Vamos considerar o seguinte cenário:

d:\bat> tree /F "d:\temp\FOLDER 1"
Folder PATH listing for volume VolName
Volume serial number is ABCD-EFGH
D:\TEMP\FOLDER 1
├───BATCHES
│       batch1.bat
│
└───PROGRAMS
        pro.exe

Então, use %~dp0 link relativo ao script em lote e .. caminho relativo para o diretório pai como no script a seguir:

@echo OFF
SETLOCAL EnableExtensions
echo(
echo                                     listing "%~dp0"
dir /B /S "%~dp0"
echo                                     listing "%~dp0..\programs"
dir /B /S "%~dp0..\programs"

Saída :

d:\bat> "d:\temp\FOLDER 1\BATCHES\batch1.bat"

                                    listing "d:\temp\FOLDER 1\BATCHES\"
d:\temp\FOLDER 1\BATCHES\batch1.bat
                                    listing "d:\temp\FOLDER 1\BATCHES\..\programs"
d:\temp\FOLDER 1\programs\pro.exe

d:\bat>

Nota naquela %~dp0..\PROGRAMS difere de ..\PROGRAMS geralmente:

  • %~dp0..\PROGRAMS é o caminho relativo ao diretório em que o lote reside
    • ( d:\temp\FOLDER 1\BATCHES\ no exemplo acima)
  • ..\PROGRAMS é um caminho relativo ao diretório atual em que o lote foi iniciado
    • ( d:\bat\ no exemplo acima)
JosefZ
fonte
se eu posso perguntar, é um %~dp0 parte com todo SETLOCAL 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 deveria
user902300
Culpa minha, desculpe. Imagine set "PathToBatch=%~dp0" (qual estava lá no script durante a depuração). Responda atualizado.
JosefZ
Eu quis dizer: qual é a diferença entre "%~dp0..\\FILES\myfile.x" e "..\\FILES\myfile.x"? E porque eu preciso dir /B /S ?
user902300
A diferença agora é explicada na resposta atualizada. eu usei 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.
JosefZ