Войти

Показать полную графическую версию : [решено] Обрезать переменную до символа обратной косой черты


Steklopaket
09-03-2017, 20:47
Здравствуйте!
Задача стоит следующая. Имеется переменная, которая хранит абсолютные и относительные пути к папкам и файлам. Нужно в ней обрезать всё до последней (если их >1) обратной косой черты включительно (т.е. оставить всё, что после). Если последним символом переменной является обратная косая черта, то её убрать и обрезать до предпоследней включительно. И результат запихнуть в новую переменную. Примеры:
"C:\папка 1\папка 2" --> "папка 2"
"C:\папка 1\папка 2\" --> "папка 2"
"папка 2" --> "папка 2"
"папка 2\" --> "папка 2"

Iska
09-03-2017, 23:05
@echo off
setlocal enableextensions enabledelayedexpansion

set sFolder=C:\папка 1\папка 2\
if "%sFolder:~-1%" equ "\" set sVar=%sFolder:~0,-1%
for %%i in ("%sVar%") do echo [%%~nxi]


endlocal
exit /b 0

@echo off
setlocal enableextensions enabledelayedexpansion

for %%i in ("C:\папка 1\папка 2" "C:\папка 1\папка 2\" "папка 2" "папка 2\") do (
echo +[%%~i]
set sVar=%%~i
if "!sVar:~-1!" equ "\" set sVar=!sVar:~0,-1!
for %%j in ("!sVar!") do echo -[%%~nxj]
echo.
)

endlocal
exit /b 0

Steklopaket
10-03-2017, 12:42
Iska, я попробовал первый вариант, работает, но только если в конце имеется обратная косая черта, иначе выводит пустое значение. Второй вариант работает вроде прекрасно. Немного переделал его под себя (добавил присвоение результата переменной). Получилось так:
@echo off
setlocal enableextensions enabledelayedexpansion

set "name=C:\папка 1\папка 2\"
for %%i in ("%name%") do (
set sVar=%%~i
if "!sVar:~-1!" equ "\" set sVar=!sVar:~0,-1!
for %%j in ("!sVar!") do set "name2=%%~nxj"
)
echo %name2%

endlocal
exit /b 0
Но я так понял, этот вариант можно упростить?

megaloman
10-03-2017, 12:48
@Echo Off
cls

Set DPath="C:\папка 1\папка 2\"

Call :Restrict %DPath% "LastDir"

Echo %DPath% %LastDir%
pause
GoTo :Eof

:Restrict
Set "sDPath=%~1"
If "%sDPath:~-1%"=="\" (
FOR /D %%f IN ("%sDPath:~0,-1%") DO Set %~2="%%~nxf"
) Else (
Set %~2="%~nx1"
)
GoTo :Eof
В первом аргументе исходный путь в кавычках, во втором аргументе имя в кавычках (без %%) переменной
Примеры использования:
Set DPath="C:\папка 1\папка 2\"
Call :Restrict %DPath% "LastDir"
Echo %DPath% %LastDir%

Call :Restrict "C:\папка 1\папка 2" "LastDir"
Echo %LastDir%

Call :Restrict "папка 2\" "Tralala"
Echo %Tralala%

pause
GoTo :Eof
@Echo Off
cls

setlocal enableextensions enabledelayedexpansion

for %%i in ("C:\папка 1\папка 2" "C:\папка 1\папка 2\" "папка 2" "папка 2\") do (
Call :Restrict "%%~i" "sVar"
echo +[%%~i]
echo -[!sVar!]
echo.
)

pause
GoTo :Eof

:Restrict
Set "sDPath=%~1"
If "%sDPath:~-1%"=="\" (
FOR /D %%f IN ("%sDPath:~0,-1%") DO Set %~2="%%~nxf"
) Else (
Set %~2="%~nx1"
)
GoTo :Eof

Steklopaket
10-03-2017, 14:19
megaloman, спасибо за решение, работает! Только один момент, значение получается в кавычках, можно ли вместо Set %~2="%%~nxf" написать Set "%~2=%%~nxf" , чтобы получилось без кавычек ? Так вроде как надо работает.

Вобщем, решения уже имеются, и если в варианте, предложенном Iska, никто не предложит оптимизацию (если она возможна, т.к. я за основу взял 2-ой вариант, и насколько я понял, его можно упростить до 1-го), то в любом случае помечу тему решённой.

megaloman
10-03-2017, 14:37
Steklopaket, чтобы получилось без кавычек надо сделать так::Restrict
Set "sDPath=%~1"
If "%sDPath:~-1%"=="\" (
FOR /D %%f IN ("%sDPath:~0,-1%") DO Set "%~2=%%~nxf"
) Else (
Set "%~2=%~nx1"
)
GoTo :Eof
У Iska в первом варианте пропущена строчкаset "sFolder=C:\папка 1\папка 2"
set "sVAR=%sFolder%"
Steklopaket, Я бы рекомендовал при присваивании переменной строкового значения брать это действие в кавычки, напимер:
set "sFolder=C:\папка 1\папка 2"
Зачем это нужно: Вы визуально не в состоянии контролировать, имеются ли сзади строкового значения лишние пробелы. Часто они приводят к ошибкам.

Steklopaket
10-03-2017, 15:32
megaloman, спасибо большое! Тема решена.

Iska
10-03-2017, 16:09
Зачем это нужно: Вы визуально не в состоянии контролировать, имеются ли сзади строкового значения лишние пробелы. »
Он — нет. Я — да:http://i.imgur.com/C3Xo2Px.png
Просто нужен правильный редактор :).

kalam
14-02-2023, 20:56
без кавычек надо сделать так: »
Захотелось реанимировать ветку, вот с чем:
я использую символ ^ в названиях папок. Каюсь (знак экрана в пакетниках), но законом ФС - не запрещено.
Можно подправить Ваш алгоритм дабы удовлетворить синтаксис? (Мне не хватает опыта)

И Второе: я сделал батник, который создает пару символьных ссылок(точек повторного анализа) в двух папках. Как бы "связывая" их, взаимными внутренними ссылками. Удобно для некоего реестра.
Пользую MKLINK /D ..
Использовал Ваш алгоритм "вычисления имени последней папки" коим и называются эти внутренние ссылки-папки.
И тут проблема - ссылки тоже могут участвовать в связях. Хочу заменять путь таких символьных ссылок (встречающиеся в пути) до реального пути.

Могу "нарисовать" для удобства понимания:

реальные папки
d:\1\
d:\2\
d:\3\

Так мой пакетник "связывает" две папки d:\1\ и d:\2\ символическими ссылками на них
создается d:\1\2 ссылается на d:\2
создается d:\2\1 ссылается на d:\1

и еще хочу "связать" так (папку и уже ссылку)
d:\1\2\3 ссылается на d:\3
d:\3\2 ссылается на d:\1\2 (это уже есть ссылка), а хотелось бы ВЫЧИСЛЯТЬ путь на "ее живую" папку, т.е. d:\2

т.е. еще нужен алгоритм преобразования пути с ссылками на путь лишь с реальными папками.

На практике, в пути могут встречаться и не одна ссылка и "неугодные" строковые-bat-символы & % ^ !, разрешенные в именах папок.
Про передачу параметров расскажу если надо. И там будет еще вопрос.

megaloman
15-02-2023, 00:19
@Echo Off
cls
Set "FullDir=Z:\Box_In\тра| ля& ля ^ ku^ku\f!ff ^ ggg! $ hhh & ffff |hfhgfhf\"

Echo "%FullDir%"
Call :Restrict "%%FullDir%%" "LastDir"
Echo "%LastDir%"
Pause
Exit /B

:Restrict
Set "sDPath=%~1"
If "%sDPath:~-1%"=="\" (
FOR /D %%f IN ("%sDPath:~0,-1%") DO Set "%~2=%%~nxf"
) Else (
Set "%~2=%~nx1"
)
Exit /B

kalam
15-02-2023, 09:09
Call :Restrict "%%FullDir%%" "LastDir" »
Уважаемый megaloman, вижу что подпрограмма работает как должно без изменений.
Моя проблема была именно в ее вызове. Спасибо!

Я долблю инет на предмет объяснения двойных символов процента вокруг переменной и не нахожу ответа. Именно они решают проблему символа экрана. Без второй пары (%%Var%%) - символ ^ удваивается.
Если можно - объясните, плиз, как они работают.


Вторую часть моего вопроса про разрешения пути символьной ссылки - выделить в отдельную тему?
Я вчера покурил инет, и пока, кроме как парсить команду dir не вижу решения. Причем, опять, придется подсчитывать парные квадратные скобки, если таковые участвуют в именах папок пути. Для меня пока сложно составлять такие циклы.




© OSzone.net 2001-2012