Показать полную графическую версию : [решено] Скопировать часть имени файла в переменную
crazydog
17-06-2019, 20:17
Добрый день уважаемые форумчане. Не могу решить задачку. Буду благодарен.
В папке лежат файлы типа CONS#111_000000.USR либо CONS#1_000000.USR
Необходимо 000000 закинуть в переменную.
Нашел способ
setlocal ENABLEDELAYEDEXPANSION
cd RECEIVE
for %%i in (*.usr) do (
set FILENAME=%%i
set NUMBER=!FILENAME:~7,6!
echo !NUMBER!
)
но данный вариант не "универсален", т.к. не учитывает количество символов в файле (9 или 7 символов в начале).
P.S. В итоге нужно с конца имени пропустить 4 символа (.USR) и использовать следующие 6 символов (000000)
set NUMBER=!FILENAME:~7,6! »
Если количество символов после подчёркивания во всех именах одинаково и они везде завершают имя — надо отсчитывать не от начала имени, а 6 символов от конца.
А для извращенцев — начинать отсчёт вперёд от символа подчёркивания. :)
crazydog
17-06-2019, 20:25
надо отсчитывать не от начала имени, а 6 символов от конца. »
Вот и вопрос как это реализовать на практике!
crazydog, я-то могу написать — но мне придётся долго вспоминать и смотреть документацию. :(
Коллеги же напишут этот код за 5 секунд с закрытыми глазами — так что подождите их ответ(ы).
И пока можете попробовать найти сами, как это делается: там что-то элементарное.
PS
Типа:
set NUMBER=!FILENAME:~-6!— но надо чтобы имя файла подставлялось без расширения.
crazydog
17-06-2019, 21:02
да, работает, но нужно расширение убрать
crazydog
При условии, что расширение 3-символьное — берём 10 последних символов и отбрасываем 4 самых последних (.ext):
set NUMBER=!FILENAME:~-10,-4!
Но коллеги напишут изящнее...
PS
...возможно использовав в цикле конструкцию delims=.— тогда расширение отрежется независимо от его длины и наличия, и можно будет использовать мой первый вариант (т.е. просто ~-6)
megaloman
17-06-2019, 21:16
@Echo Off
cls
Set "BoxIn=Z:\Box_In"
Set "Mask=CONS#*_??????.USR"
FOR /F "usebackq tokens=2 delims=_." %%n IN (`2^>nul Dir /B /A:-D "%BoxIn%\%Mask%"`) DO Echo %%n
Pause
Exit /B
@Echo Off
cls
SetLocal EnableExtensions EnableDelayedExpansion
Set "BoxIn=Z:\Box_In"
Set "Mask=CONS#*_??????.USR"
FOR /F "usebackq tokens=2 delims=_." %%n IN (`2^>nul Dir /B /A:-D "%BoxIn%\%Mask%"`) DO (
Set "NN=%%n"
Echo !NN!
)
EndLocal
Pause
Exit /B@Echo Off
cls
SetLocal EnableExtensions EnableDelayedExpansion
Set "BoxIn=Z:\Box_In"
Set "Mask=CONS#*_??????.USR"
FOR /F "usebackq delims=" %%n IN (`2^>nul Dir /B /A:-D "%BoxIn%\%Mask%"`) DO (
Set "NN=%%~nn"
Set "NN=!NN:~-6!
Echo !NN!
)
EndLocal
Pause
Exit /B@Echo Off
cls
SetLocal EnableExtensions EnableDelayedExpansion
Set "BoxIn=Z:\Box_In"
Set "Mask=CONS#*_??????.USR"
FOR /F "usebackq delims=" %%n IN (`2^>nul Dir /B /A:-D "%BoxIn%\%Mask%"`) DO (
Set "NN=%%~nn"
Set "NN=!NN:*_=!
Echo !NN!
)
EndLocal
Pause
Exit /B
DJ Mogarych
17-06-2019, 21:31
Powershell:
$f = (gci *.usr).basename |select -first 1
$l = $f.length
$num = $f.substring($l - 6)
Первый вариант предпочтительнее, остальные, ИМХО, хуже»
Вариант со звёздочкой — надёжнее. Только в маске я не уверен (про жёсткое количество «?», впрочем, я уже не помню форматы построения имён Кщнсультант+).
а я, вероятно, сделал бы нечто среднее от кодов megaloman, что-то типа:
@echo off
set "d=C:\Papka"
set "m=CONS#*_*"
pushd "%d%"
for /f "tokens=2 delims=_" %%a in ('dir /a-d/b "%m%"') do echo %%~na
popd
pause
exit
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.