Получить часть текущего пути - PullRequest
0 голосов
/ 14 апреля 2020

Я хотел бы получить часть текущего каталога, откуда мой пакетный скрипт.

Местоположение выглядит примерно так: Y: \ abc \ def \ ghi \ jkl \ script.bat

Я просто хочу сохранить то, что после Y: \ abc \ def \ (то есть \ ghi \ jkl)

Как это сделать?

Я использую код ниже для получения полного пути, но как сделать разграничение?

for /f %%a in ("%CD%") do set CURR=%%a
echo %CURR%

Спасибо за вашу драгоценную помощь.

Ответы [ 3 ]

0 голосов
/ 14 апреля 2020

Исходя из вашего заявленного «каталога, откуда мой пакетный скрипт», должно хватить следующего: (последняя строка добавлена ​​в демонстрационных целях, пожалуйста, измените ее при необходимости) :

@Set "x=%~dp0"&SetLocal EnableDelayedExpansion
@Set "i=0"&Set "x!i!=%x:\="&Set /A i+=1&Set "x!i!=%"
@Set /A i-=1,y=i-1
@If %i% Lss 1 (Set "z=%x0%\")Else (If %i% Equ 1 (Set "z=%x0%\%x1%"
        )Else Set "z=!x%y%!\!x%i%!")
@EndLocal&Set "y=%z%"
@Echo %x% becomes %y%&Pause

Я сделал так, чтобы, если каталог скриптов не был достаточно глубоким, полный путь по-прежнему выводился.

Если вы хотите использовать текущий каталог вместо местоположения скриптов, измените %~dp0 в строке 1 до %__CD__% или %CD%\ при необходимости.

0 голосов
/ 15 апреля 2020
@echo off
setlocal

set "reversed="
set "fromdir=%~dp0"

for %%A in ("%fromdir:\=" "%") do call set "reversed=%%~A\%%reversed%%"
for /f "tokens=1-2 delims=\" %%A in ("%reversed%") do set "result=\%%B\%%A"

echo %result%
pause

Если сегменты пути можно поменять местами, то получение последних 2 сегментов является известным числом для установки опции токенов 1-2, так как они станут первыми 2 сегментами. 1-й for l oop делает задний ход. 2nd for l oop получает первые 2 токена и устанавливается в result в обратном порядке, который является исходным порядком.

fromdir устанавливается для каталога скриптов %~dp0 хотя его можно установить с помощью %cd%, если требуется.

Просмотр set /? того, как "%fromdir:\=" "%" выполняет замену \ на " ", так что сегменты пути становятся отдельными аргументами, т.е. "C:\dir1\dir2\dir3" становится "C:" "dir1" "dir2" "dir3".

0 голосов
/ 14 апреля 2020

Я полагаю, что, возможно, вы могли бы поместить секцию для обрезки в текстовый файл, а затем манипулировать строкой из l oop в файле, например:

echo %cd% > path.txt

for /f "tokens=3,* delims=\" %%a in (path.txt) do echo %%b

Определение глубины с помощью аргумент tokens=3 с символом-разделителем "\".

...