Получить абсолютный путь через CMD скрипт каталога - PullRequest
0 голосов
/ 24 октября 2019

script-being-invoked.cmd:

REM This is my script file, it is being invoked from anywhere
REM Get absolute path to root directory
set astr=%~dp0
set substr1=\mq_1.7.6\interface\
set substr2=\
call set rootPath=%%astr:%substr1%=%substr2%%%

Я пытаюсь получить абсолютный путь к каталогу несколькими путями ниже из файла, вызываемого в каталоге interface. Однако проблема заключается в том, что путь в приведенном выше коде изменяется. Версия в mq_1.7.6 может измениться. Есть ли способ получить это значение с помощью сценариев cmd? Я бы сделал \..\.., но, похоже, это не работает в Windows.

Ответы [ 3 ]

1 голос
/ 24 октября 2019

Обычно я делаю это, используя схему расширения ~fi. К сожалению, это может использоваться (по крайней мере, насколько мне известно) только в цикле for.

set "parentdir=%~dp0.."
for %%i in ("%parentdir%") do set "realparent=%%~fi"
echo "%parentdir%"
echo "%realparent%"

Если вышеупомянутое находится в пакетном файле, расположенном в c:\foo\bar\mq_1.7.6\interface, переменная realparent будет содержать c:\foo\bar\mq_1.7.6, а parentdir будет содержать c:\foo\bar\mq_1.7.6\interface\...

Так что for цикл по существу превращает относительный путь в абсолютный путь.

0 голосов
/ 24 октября 2019

Из вашего вопроса следует, что вы пытаетесь получить имя деда сценария, в данном случае mq_1.7.6.

Однако все еще немного неясно, хотите ли вы это изолированнот. е. mq_1.7.6 или как абсолютный путь, например P:\ath\to\mq_1.7.6


Если первым является ваше намерение, то должно быть достаточно следующего:
@For %%A In ("%~f0\..\..")Do @Echo(%%~nxA

Если вам это нужнов качестве переменной:

@For %%A In ("%~f0\..\..")Do @Set "Gp=%%~nxA"

Если вы просто пытаетесь захватить строку версии из mq_1.7.6, в данном случае 1.7.6, то простая дополнительная строка может быть всем, что требуется:

@For %%A In ("%~f0\..\..")Do @Set "Gp=%%~nxA"
@Set "Gp=%Gp:*_=%"


Если, с другой стороны, вы хотели последнее, то есть абсолютный путь прародителя сценариев, единственное реальное отличие заключается в расширении метавариума:
@For %%A In ("%~f0\..\..")Do @Echo(%%~fA

Если вам нужно это как переменная, то:

@For %%A In ("%~f0\..\..")Do @Set "Gp=%%~fA"


Если ни одна из моих интерпретаций вашего намерения не верна, можете ли вы привести пример того, что вы хотите вернуть, и хотите ли вычто просто печатать наконсоль или сохранение в качестве переменной и т. д.
0 голосов
/ 24 октября 2019

Вот один метод:

@pushd "%~dp0..\"
@echo %cd%
@popd

короче на одну строку:

@pushd "%~dp0..\" && echo %cd% && popd
...