Войти

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


Instant_SR
24-07-2013, 17:43
Прошу помощи с реализацией именно *.bat:
Есть конструкция в которой "вращается" счетчик вида:

:loop_len
if not "%papka%"=="" (
set papka=%papka:~1%
set /a n=%n% + 1
goto loop_len
)

Тут все отлично значение %n% верное
Есть вторая конструкция, возвращающая строками, что находится в указанной папке в виде полного адреса к конечному файлу:

for /f "tokens=*" %%i in ('dir /b /s "%papka%"') do (
set find_adr=%%i
echo %find_adr%
)

Есть вариант команды "echo %[строка]:~[число]%" которая отсекает [число] знаков слева у [строка]

Мне нужна помощь в том, чтобы из строки второй конструкции %find_adr% отнять число %n% знаков слева, которые получаются из первой конструкции.

т.е. вида "echo %%find_adr%:~%n%%" но в таком варианте второй символ % распознается, как окончание конструкции... Кто в курсе, как можно обойти такой момент?

Iska
24-07-2013, 18:22
Instant_SR, не совсем понятна глобальная Ваша цель, но используйте «setlocal enableextensions enabledelayedexpansion» в начале пакетного файла и «!find_adr:~%n%!».

Хорошо бы Вы привели полный код Вашего пакетного файла.

Sphinx114
24-07-2013, 18:47
@echo off
set "papka=C:\folder\"

setlocal
:loop_len
if not "%papka%"=="" (
set papka=%papka:~1%
set /a n+=1
goto loop_len
)
endlocal & set n=%n%

for /f "tokens=*" %%i in ('dir /b /s "%papka%"') do (
set find_adr=%%i
call echo %%find_adr:~%n%%%
)
pause
Альтернативный вариант:
@echo off
set "papka=C:\folder\"
for /f "delims=" %%i in ('dir /b /s "%papka%"') do (
set find_adr=%%i
call echo %%find_adr:%papka%=%%
)
pause

Instant_SR
25-07-2013, 11:18
Iska, благодарю, я так пытался, но SETLOCAL установлено было не в начале скрипта, а перед входом в :loop_len
кому интересно. вот даю тестовый текст кода от начала и до конца:

@ECHO off
@COLOR 3
@CHCP 866
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
CLS
SET pc=%COMPUTERNAME% && SET path=C:\%COMPUTERNAME%
ECHO "Имя ПК = %pc%" && ECHO "Путь к тестовой папке = %path%"
ECHO "Посчитаем число символов в пути к тестовой папке"
PAUSE
SET /A counter=0
:loop_len
IF NOT "%path%"=="" (
SET path=%path:~1%
SET /A counter=%counter%+1
GOTO loop_len
)
SET path=C:\%COMPUTERNAME%
ECHO Счетчик = %counter%
ECHO "Выведем список файлов в директории %path%"
PAUSE
FOR /F "TOKENS=*" %%i IN ('DIR /B /S "%path%"') DO (
SET result=%%i
ECHO !result:~%counter%!
)
PAUSE

Результат: "result" выводится с 1 "лишним символом" слева так что есть резон "отрезать" на 1 символ больше

Iska
25-07-2013, 11:37
Instant_SR, есть куда более простой способ:
@echo off
setlocal enableextensions enabledelayedexpansion

for /f "usebackq delims=" %%i in (`dir /a:-d /b /s "c:\%ComputerName%\*.*"`) do (
echo %%~nxi
)

endlocal
exit /b 0




© OSzone.net 2001-2012