Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Обрезать переменную до символа обратной косой черты

Ответить
Настройки темы
CMD/BAT - [решено] Обрезать переменную до символа обратной косой черты

Аватара для Steklopaket

Новый участник


Сообщения: 37
Благодарности: 0


Конфигурация

Профиль | Отправить PM | Цитировать


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

Отправлено: 20:47, 09-03-2017

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить 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
Код: Выделить весь код
@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
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:05, 09-03-2017 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Steklopaket

Новый участник


Сообщения: 37
Благодарности: 0

Профиль | Отправить PM | Цитировать


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
Но я так понял, этот вариант можно упростить?

Отправлено: 12:42, 10-03-2017 | #3


Ветеран


Contributor


Сообщения: 2733
Благодарности: 1698

Профиль | Отправить 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


Аватара для Steklopaket

Новый участник


Сообщения: 37
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 14:19, 10-03-2017 | #5


Ветеран


Contributor


Сообщения: 2733
Благодарности: 1698

Профиль | Отправить 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
У Iska в первом варианте пропущена строчка
Код: Выделить весь код
set "sFolder=C:\папка 1\папка 2"
set "sVAR=%sFolder%"
Steklopaket, Я бы рекомендовал при присваивании переменной строкового значения брать это действие в кавычки, напимер:
set "sFolder=C:\папка 1\папка 2"
Зачем это нужно: Вы визуально не в состоянии контролировать, имеются ли сзади строкового значения лишние пробелы. Часто они приводят к ошибкам.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 10-03-2017 в 14:54.

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:37, 10-03-2017 | #6


Аватара для Steklopaket

Новый участник


Сообщения: 37
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 15:32, 10-03-2017 | #7


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 16:09, 10-03-2017 | #8


Новый участник


Сообщения: 4
Благодарности: 0

Профиль | Отправить 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


Ветеран


Contributor


Сообщения: 2733
Благодарности: 1698

Профиль | Отправить 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



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Обрезать переменную до символа обратной косой черты

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход