Скопировать часть имени файла в переменную
Добрый день уважаемые форумчане. Не могу решить задачку. Буду благодарен.
В папке лежат файлы типа 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)
|
Цитата:
Цитата crazydog
set NUMBER=!FILENAME:~7,6! »
|
Если количество символов после подчёркивания во всех именах одинаково и они везде завершают имя — надо отсчитывать не от начала имени, а 6 символов от конца.
А для извращенцев — начинать отсчёт вперёд от символа подчёркивания. :)
|
Цитата:
Цитата mwz
надо отсчитывать не от начала имени, а 6 символов от конца. »
|
Вот и вопрос как это реализовать на практике!
|
crazydog, я-то могу написать — но мне придётся долго вспоминать и смотреть документацию. :(
Коллеги же напишут этот код за 5 секунд с закрытыми глазами — так что подождите их ответ(ы).
И пока можете попробовать найти сами, как это делается: там что-то элементарное.
PS
Типа:
Код:
set NUMBER=!FILENAME:~-6!
— но надо чтобы имя файла подставлялось без расширения.
|
да, работает, но нужно расширение убрать
|
crazydog
При условии, что расширение 3-символьное — берём 10 последних символов и отбрасываем 4 самых последних (.ext):
Код:
set NUMBER=!FILENAME:~-10,-4!
Но коллеги напишут изящнее...
PS
...возможно использовав в цикле конструкцию — тогда расширение отрежется независимо от его длины и наличия, и можно будет использовать мой первый вариант (т.е. просто ~-6)
|
Код:
@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 2875973 |
Powershell:
Код:
$f = (gci *.usr).basename |select -first 1
$l = $f.length
$num = $f.substring($l - 6)
|
Цитата:
Цитата megaloman
Первый вариант предпочтительнее, остальные, ИМХО, хуже »
|
Вариант со звёздочкой — надёжнее. Только в маске я не уверен (про жёсткое количество «?», впрочем, я уже не помню форматы построения имён Кщнсультант+).
|
а я, вероятно, сделал бы нечто среднее от кодов 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
|
Время: 23:22.
© OSzone.net 2001-