Как перемещаться в диапазоне родительской папки без полного пути?

631
user902300

Есть ли способ, как перейти к программе, которая находится в другой папке родительского каталога, не используя полный путь?

У меня здесь есть партия:

FOLDER 1\BATCHES\batch1.bat 

который использует программу, которая находится в:

FOLDER 1\PROGRAMS\pro.exe 

и моя партия выглядит так:

"%SYSTEMDRIVE%\Temp\FOLDER 1\PROGRAMS\pro.exe" --input "%SYSTEMDRIVE%\Temp\FOLDER 1\SCRIPT\script.srpt" --output "%SYSTEMDRIVE%\Temp\FOLDER 1\FILES\myfile.x" 

как вы видите, он заблокирован в каком-то месте %SYSTEMDRIVE%\Temp\, чтобы сделать мой сценарий «переносимым», могу ли я что-то заменить %SYSTEMDRIVE%\Temp\?

или, говоря другими словами: я хотел бы удалить все экземпляры %SYSTEMDRIVE%\Temp\из моей партии и заменить его чем-то таким образом, чтобы, если я перенесу свою FOLDER 1 куда- нибудь на моем ПК, он запустился

0
`.. \ ПАРТИЙ \ batch1.bat` Joel Coehoorn 5 лет назад 0

2 ответа на вопрос

0
LotPings
  • Папка, в которой находится партия, может быть получена %~dp0(с обратной косой чертой)
  • Файловая система заботится об относительных папках, адресуемых на ..один уровень выше.

В tree A: /Fтаком виде:

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

Эта партия:

:: 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%" 

будет иметь такой вывод:

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" 
если я могу спросить, нужна ли часть `% ~ dp0` с целым` для %% A в (".... ... Set_` часть и зачем? Я пробовал только с этим:` ".. \\ PROGRAMS \ pro.exe "--input" .. \\ SCRIPT \ script.srpt "--output" .. \\ FILES \ myfile.x "`, и пакетный процесс выполняет все как следует user902300 5 лет назад 0
`For` просто используется для разрешения выражения внутри двойных кавычек, оно также будет работать напрямую, но менее понятно:` A: \ FOLDER 1 \ BATCHES \ .. \ PROGRAMS \ pro.exe` в моем примере. LotPings 5 лет назад 0
я имел в виду следующее: да, я понимаю весь ваш ответ / код ... просто в обоих ответах так или иначе упоминается использование `% ~ dp0`, так что мой вопрос был более о: это выбор способа использования `% ~ dp0` или я теряю какое-либо преимущество, если я иду без него, просто и только с помощью` ".. \\ PROGRAMS \ pro.exe" --input ".. \\ SCRIPT \ script.srpt" --output ".. \\ FILES \ myfile.x" `и ничего больше user902300 5 лет назад 0
В зависимости от контекста `" .. \ PROGRAMS \ pro.exe "--input" .. \ SCRIPT \ script.srpt "--output" .. \ FILES \ myfile.x "` может ссылаться на текущий каталог `% CD % `, который не обязательно совпадает с путём пакета. LotPings 5 лет назад 0
Я прошу прощения, если я раздражаюсь, но не могли бы вы объяснить: «** ... может относиться к текущему каталогу% CD%, который не обязательно совпадает с путем к пакету. **« Я читаю его все и не могу понять точка user902300 5 лет назад 0
Когда вы открываете окно cmd, вы видите приглашение типа `C: \ Users \ UserName>`, в этой папке выполняются все действия без указания другого пути. Если вы вызываете пакет с путем, подобным `C: \ Temp \ FOLDER 1 \ BATCHES \ batch1.bat`, текущий каталог остается тем же` C: \ Users \ UserName`, поэтому относительный путь будет относительно текущей папки, а не в папку, в которой находится пакет. LotPings 5 лет назад 1
0
JosefZ

Давайте рассмотрим следующий сценарий:

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 

Затем используйте %~dp0ссылку относительно Batch Script и ..относительный путь к родительскому каталогу, как в следующем сценарии:

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

Выход :

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> 

Обратите внимание, что%~dp0..\PROGRAMS отличается от ..\PROGRAMSобщего:

  • %~dp0..\PROGRAMS путь относительно каталога, в котором находится пакет
    • (d:\temp\FOLDER 1\BATCHES\в приведенном выше примере)
  • ..\PROGRAMS  путь относительно текущего каталога, из которого был запущен пакет
    • ( d:\bat\в приведенном выше примере)
если можно спросить, это часть `% ~ dp0` со всей частью` SETLOCAL EnableExtensions ... dir / B / S "% PathToBatch%" ... dir / B / S "% PathToBatch% .. \ Programs" ` нужен и зачем? Я попробовал только с этим: `" .. \\ PROGRAMS \ pro.exe "--input" .. \\ SCRIPT \ script.srpt "--output" .. \\ FILES \ myfile.x "` и пакетное выполнение все как должно user902300 5 лет назад 0
Моя вина, прости. Представьте себе `set" PathToBatch =% ~ dp0 "` (который был в сценарии во время отладки). Ответ обновлен. JosefZ 5 лет назад 0
Я имел в виду: в чем разница между `"% ~ dp0 .. \\ FILES \ myfile.x "` и `" .. \\ FILES \ myfile.x "`? И зачем мне нужен `dir / B / S`? user902300 5 лет назад 0
Разница теперь объясняется в обновленном ответе. Я использовал `dir / B / S"% ~ dp0 .. \ Programs "` просто чтобы показать результат использования `..` в спецификации пути. SuperUser не является бесплатной службой сценариев, поэтому вы не можете ожидать надежного решения в любое время. JosefZ 5 лет назад 0