|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Обрезать переменную до символа обратной косой черты |
|
|
CMD/BAT - [решено] Обрезать переменную до символа обратной косой черты
|
Новый участник Сообщения: 37 |
Здравствуйте!
Задача стоит следующая. Имеется переменная, которая хранит абсолютные и относительные пути к папкам и файлам. Нужно в ней обрезать всё до последней (если их >1) обратной косой черты включительно (т.е. оставить всё, что после). Если последним символом переменной является обратная косая черта, то её убрать и обрезать до предпоследней включительно. И результат запихнуть в новую переменную. Примеры: "C:\папка 1\папка 2" --> "папка 2" "C:\папка 1\папка 2\" --> "папка 2" "папка 2" --> "папка 2" "папка 2\" --> "папка 2" |
|
Отправлено: 20:47, 09-03-2017 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать @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
|
Отправлено: 23:05, 09-03-2017 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 37
|
Профиль | Отправить PM | Цитировать Iska, я попробовал первый вариант, работает, но только если в конце имеется обратная косая черта, иначе выводит пустое значение. Второй вариант работает вроде прекрасно. Немного переделал его под себя (добавил присвоение результата переменной). Получилось так:
Но я так понял, этот вариант можно упростить? |
Отправлено: 12:42, 10-03-2017 | #3 |
Ветеран Сообщения: 2733
|
Профиль | Отправить PM | Цитировать Я бы посчитал удобным оформить это в виде подпрограммы
@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 |
------- Отправлено: 12:48, 10-03-2017 | #4 |
Новый участник Сообщения: 37
|
Профиль | Отправить PM | Цитировать megaloman, спасибо за решение, работает! Только один момент, значение получается в кавычках, можно ли вместо Set %~2="%%~nxf" написать Set "%~2=%%~nxf" , чтобы получилось без кавычек ? Так вроде как надо работает.
Вобщем, решения уже имеются, и если в варианте, предложенном Iska, никто не предложит оптимизацию (если она возможна, т.к. я за основу взял 2-ой вариант, и насколько я понял, его можно упростить до 1-го), то в любом случае помечу тему решённой. |
|
Отправлено: 14:19, 10-03-2017 | #5 |
Ветеран Сообщения: 2733
|
Профиль | Отправить PM | Цитировать 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 set "sFolder=C:\папка 1\папка 2" Зачем это нужно: Вы визуально не в состоянии контролировать, имеются ли сзади строкового значения лишние пробелы. Часто они приводят к ошибкам. |
------- Последний раз редактировалось megaloman, 10-03-2017 в 14:54. Отправлено: 14:37, 10-03-2017 | #6 |
Новый участник Сообщения: 37
|
Профиль | Отправить PM | Цитировать megaloman, спасибо большое! Тема решена.
|
Отправлено: 15:32, 10-03-2017 | #7 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
Скрытый текст
![]() Просто нужен правильный редактор ![]() |
|
Отправлено: 16:09, 10-03-2017 | #8 |
Новый участник Сообщения: 4
|
Профиль | Отправить PM | Цитировать Цитата 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-символы & % ^ !, разрешенные в именах папок. Про передачу параметров расскажу если надо. И там будет еще вопрос. |
|
Отправлено: 20:56, 14-02-2023 | #9 |
Ветеран Сообщения: 2733
|
Профиль | Отправить PM | Цитировать @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 |
------- Отправлено: 00:19, 15-02-2023 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - Сверка 2 текстовых фалов до определенного символа | greenco | Скриптовые языки администрирования Windows | 3 | 28-07-2016 01:15 | |
CMD/BAT - [решено] Добавить в реестр переменную именно как переменную %var% а не как ее значение | NoIZz | Скриптовые языки администрирования Windows | 3 | 13-08-2012 21:52 | |
Форма обратной связи | lora.1 | Вебмастеру | 0 | 21-05-2012 17:25 | |
[решено] Обрезать строку до указанного символа | rimm | AutoIt | 5 | 25-09-2009 16:32 | |
Alone in the Dark: У последней черты (2008) | Anatoliy2004 | Игры | 3 | 18-04-2009 09:21 |
|