расширение каталога командных файлов - PullRequest
2 голосов
/ 10 августа 2010

Я пытаюсь написать командный файл, который существует в произвольном каталоге и создаст новый каталог на два уровня выше.Например, пакетный файл здесь:

w:\src\project\scripts\setup.bat

создаст:

w:\src\project.build

Я не могу понять, как расширить путь.Вот что я сейчас делаю:

@set SCRIPT_DIR=%~dp0
@set ROOT_DIR=%SCRIPT_DIR%\..
echo ROOT DIR:  %ROOT_DIR%
@set ROOT_DIR_NAME=%ROOT_DIR:~0,-1%
@echo ROOT DIR NAME: %ROOT_DIR_NAME%

И это выдает:

ROOT DIR:  w:\src\w_dev1\scripts\\..
ROOT DIR NAME: w:\src\w_dev1\scripts\\.

Что я хотел сделать, так это получить ROOT_DIR_NAME в качестве самого каталога (без косой черты),Я знаю, что могу взломать это и переключить -1 на счет «..», но разве нет более чистого способа справиться с этим?

Ответы [ 3 ]

4 голосов
/ 10 августа 2010

Ваша строка @set ROOT_DIR_NAME=%ROOT_DIR:~0,-1% удаляет только 1 символ из значения переменной.Вы хотите удалить больше (у 'scripts' есть 7, плюс у вас есть эти '\ ..' в конце ...).Вы уверены, что у вас всегда есть 'scripts' в качестве последнего каталога в пути, куда вы устанавливаете?

В любом случае, если вы используете @set ROOT_DIR_NAME=%ROOT_DIR:~0,-11%, это должно работать для вашего конкретного примера.

ОднакоЯ бы посоветовал вам использовать более общий подход:

@set SCRIPT_DIR=%~dp0
@pushd %script_dir%
@pushd ..\..
@echo. current directory now is %cd%
@set root_dir=%cd%
@popd
@popd

Это работает независимо от длины имен каталогов.

Команды pushd изменяют каталоги (и помните, откуда они пришлиfrom) - команды popd возвращаются к тому, что запомнил pushd.Переменная %cd% содержит текущий путь + путь.

3 голосов
/ 10 августа 2010

Вы можете использовать команду для , чтобы преобразовать относительный путь в канонический абсолютный путь:

@echo off
set "SCRIPT_DIR=%~dp0"
for %%P in ("%SCRIPT_DIR%..\..") do set "ROOT_DIR_NAME=%%~fP"

Этот сценарий установит ROOT_DIR_NAME в основной родительский каталог сценария.

0 голосов
/ 09 февраля 2011

Или локальная подпрограмма

call :setvartopath ROOT_DIR_NAME "%~dp0\..\.."
goto :eof

:setvartopath
set %1=%~f2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...