Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Обрезать переменную до символа обратной косой черты (http://forum.oszone.net/showthread.php?t=324615)

Steklopaket 09-03-2017 20:47 2717988

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

Iska 09-03-2017 23:05 2718017

Код:

@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 2718157

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 2718160

Я бы посчитал удобным оформить это в виде подпрограммы
Код:

@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 2718177

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

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

megaloman 10-03-2017 14:37 2718182

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 2718200

megaloman, спасибо большое! Тема решена.

Iska 10-03-2017 16:09 2718216

Цитата:

Цитата megaloman
Зачем это нужно: Вы визуально не в состоянии контролировать, имеются ли сзади строкового значения лишние пробелы. »

Он — нет. Я — да:
Скрытый текст

Просто нужен правильный редактор :).

kalam 14-02-2023 20:56 3003212

Цитата:

Цитата megaloman
без кавычек надо сделать так: »

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

И Второе: я сделал батник, который создает пару символьных ссылок(точек повторного анализа) в двух папках. Как бы "связывая" их, взаимными внутренними ссылками. Удобно для некоего реестра.
Пользую 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 3003215

Код:

@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 3003229

Цитата:

Цитата megaloman
Call :Restrict "%%FullDir%%" "LastDir" »

Уважаемый megaloman, вижу что подпрограмма работает как должно без изменений.
Моя проблема была именно в ее вызове. Спасибо!

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


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


Время: 22:05.

Время: 22:05.
© OSzone.net 2001-