[cmd] Получить имя родительской папки в переменную
От: wildwind Россия  
Дата: 15.06.06 17:22
Оценка:
Нашел вот такое решение:
pushd ..
set fullpath=%CD%
cd ..
for /d %%D in (*) do if "%%~fD"=="%fullpath%" set parent=%%D%
popd

echo Parent folder: "%parent%"


Вопрос: существует ли более простое и изящное?
Re: [cmd] Получить имя родительской папки в переменную
От: Кодт Россия  
Дата: 16.06.06 05:32
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Вопрос: существует ли более простое и изящное?


Встречный вопрос: чем не устроило %CD%\.. ?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Перекуём баги на фичи!
Re[2]: [cmd] Получить имя родительской папки в переменную
От: wildwind Россия  
Дата: 16.06.06 07:34
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Встречный вопрос: чем не устроило %CD%\.. ?


Наверное я плохо объяснил. Пусть текущая папка C:\One\Two\Three\I-am-here. Мне нужно получить "Three".
Re[3]: [cmd] Получить имя родительской папки в переменную
От: Кодт Россия  
Дата: 16.06.06 08:53
Оценка: 14 (4)
Здравствуйте, wildwind, Вы писали:

W>Наверное я плохо объяснил. Пусть текущая папка C:\One\Two\Three\I-am-here. Мне нужно получить "Three".


Чисто на обработке строк, безо всяких экскурсов по файловой системе:
@echo off

:: на всякий случай, вдруг эти режимы выключены
setlocal enableextensions enabledelayedexpansion

set s=%cd%
echo fullpath='%s%'

:: разобъём строку на имена каталогов (по \), для этого нам нужно эскейпить настоящие пробелы
:: в качестве эскейпа используем $
:: 1) эскейпим собственно $ (заменяя его на $$)
set s=%s:$=$$%
:: 2) эскейпим пробелы (заменяя на $_)
set s=%s: =$_%
:: 3) наконец, разбиваем строку на токены
set s=%s:\= %
echo after preprocessing '%s%'

:: пробежимся по токенам
echo iterating...
for %%t in (%s%) do (
  set parent=!last!
  set last=%%t
  echo parent='!parent!' last='!last!'
)

:: unescape - в обратном порядке
set parent=%parent:$_= %
set parent=%parent:$$=$%
echo.
echo the parent is '%parent%'

Пример работы
fullpath='C:\Documents and Settings\All Users\Start Menu\Dollars$and$ many spa_ces\Child'
after preprocessing 'C: Documents$_and$_Settings All$_Users Start$_Menu Dollars$$and$$$_many$_spa_ces Child'
iterating...
parent='' last='C:'
parent='C:' last='Documents$_and$_Settings'
parent='Documents$_and$_Settings' last='All$_Users'
parent='All$_Users' last='Start$_Menu'
parent='Start$_Menu' last='Dollars$$and$$$_many$_spa_ces'
parent='Dollars$$and$$$_many$_spa_ces' last='Child'

PARENT='Dollars$and$ many spa_ces'
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Перекуём баги на фичи!
Re[4]: [cmd] Получить имя родительской папки в переменную
От: wildwind Россия  
Дата: 16.06.06 17:03
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, wildwind, Вы писали:


К>Чисто на обработке строк, безо всяких экскурсов по файловой системе:


Спасибо! До такого варианта я не додумался, все изгалялся с for /f...
Сейчас вот подумываю, какой вариант выбрать окончательно: ваш, свой или вот такой, дешевый и сердитый:
@echo off
pushd ..
set s=%cd%
set s=%s:*\=%
set s=%s:*\=%
set s=%s:*\=%
set s=%s:*\=%
:: Повторить N раз... :)
popd

echo the parent is '%s%'
Re[5]: [cmd] Получить имя родительской папки в переменную
От: Кодт Россия  
Дата: 17.06.06 08:40
Оценка:
Здравствуйте, wildwind, Вы писали:

W>set s=%s:*\=%


Ух ты, я о таком не подозревал!
А для повторения — делаем очень просто
:repeat
set next=%now:*\=%
if "%now%"=="%next%" goto done
set now=%next%
goto repeat
:done
:: здесь now содержит последний токен

А вот чтобы предпоследний токен получить... это я сходу не знаю как.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Перекуём баги на фичи!
Re[6]: [cmd] Получить имя родительской папки в переменную
От: wildwind Россия  
Дата: 17.06.06 17:27
Оценка:
Здравствуйте, Кодт, Вы писали:

К>А для повторения — делаем очень просто

К>:repeat
К>set next=%now:*\=%
К>if "%now%"=="%next%" goto done
К>set now=%next%
К>goto repeat
К>:done
К>:: здесь now содержит последний токен
К>


Громоздко как-то... Так, что ли:
set s=%cd%
for /l %%I in (0,1,20) do set s=!s:*\=!
Re[7]: [cmd] Получить имя родительской папки в переменную
От: Кодт Россия  
Дата: 19.06.06 07:31
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Громоздко как-то... Так, что ли:

set s=%cd%
W>for /l %%I in (0,1,20) do set s=!s:*\=!

Так, конечно, компактнее... но откуда такая уверенность, что глубина вложенных папок не превосходит 20?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Перекуём баги на фичи!
Re[8]: [cmd] Получить имя родительской папки в переменную
От: wildwind Россия  
Дата: 19.06.06 21:04
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Так, конечно, компактнее... но откуда такая уверенность, что глубина вложенных папок не превосходит 20?


Что-то мне подсказывает... что для реальных применений оно так.
Но для верности можно увеличить до 128 (MAX_PATH=260). Жалка нэту, да!
Re[8]: [cmd] Получить имя родительской папки в переменную
От: Young yunoshev.ru
Дата: 20.06.06 09:12
Оценка: 9 (1)
Здравствуйте, Кодт, Вы писали:

Извините что я вмешиваю в ваш междусобойчик, но таки вот так не будет ли проще

@echo off
setlocal enabledelayedexpansion
set name=%cd%
cd ..
@echo !name:%cd%\=!
endlocal
Re[9]: [cmd] Получить имя родительской папки в переменную
От: wildwind Россия  
Дата: 20.06.06 10:58
Оценка:
Здравствуйте, Young, Вы писали:

Y>Извините что я вмешиваю в ваш междусобойчик, но таки вот так не будет ли проще


Супер! Кажется это то что надо. И вроде никаких подводных камней нет. Обрабатывает даже папки первого уровня.
Большое спасибо!
Re[9]: [cmd] Получить имя родительской папки в переменную
От: Кодт Россия  
Дата: 20.06.06 11:05
Оценка:
Здравствуйте, Young, Вы писали:

Y>Извините что я вмешиваю в ваш междусобойчик, но таки вот так не будет ли проще

Y>@echo off
Y>setlocal enabledelayedexpansion
Y>set name=%cd%
Y>cd ..
Y>@echo !name:%cd%\=!
Y>endlocal

Осталось только эскейпить знаки = ~ ! потому что они могут попасться в пути и разрушить синтаксическую корректность макроподстановки.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.