Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Скопировать часть имени файла в переменную (http://forum.oszone.net/showthread.php?t=340960)

crazydog 17-06-2019 20:17 2875956

Скопировать часть имени файла в переменную
 
Добрый день уважаемые форумчане. Не могу решить задачку. Буду благодарен.
В папке лежат файлы типа 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)

mwz 17-06-2019 20:23 2875957

Цитата:

Цитата crazydog
set NUMBER=!FILENAME:~7,6! »

Если количество символов после подчёркивания во всех именах одинаково и они везде завершают имя — надо отсчитывать не от начала имени, а 6 символов от конца.

А для извращенцев — начинать отсчёт вперёд от символа подчёркивания. :)

crazydog 17-06-2019 20:25 2875959

Цитата:

Цитата mwz
надо отсчитывать не от начала имени, а 6 символов от конца. »

Вот и вопрос как это реализовать на практике!

mwz 17-06-2019 20:32 2875961

crazydog, я-то могу написать — но мне придётся долго вспоминать и смотреть документацию. :(

Коллеги же напишут этот код за 5 секунд с закрытыми глазами — так что подождите их ответ(ы).
И пока можете попробовать найти сами, как это делается: там что-то элементарное.

PS
Типа:
Код:

set NUMBER=!FILENAME:~-6!
— но надо чтобы имя файла подставлялось без расширения.

crazydog 17-06-2019 21:02 2875968

да, работает, но нужно расширение убрать

mwz 17-06-2019 21:09 2875971

crazydog

При условии, что расширение 3-символьное — берём 10 последних символов и отбрасываем 4 самых последних (.ext):
Код:

set NUMBER=!FILENAME:~-10,-4!
Но коллеги напишут изящнее...

PS
...возможно использовав в цикле конструкцию
Код:

delims=.
— тогда расширение отрежется независимо от его длины и наличия, и можно будет использовать мой первый вариант (т.е. просто ~-6)

megaloman 17-06-2019 21:16 2875972

Код:

@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)


Iska 18-06-2019 03:52 2875994

Цитата:

Цитата megaloman
Первый вариант предпочтительнее, остальные, ИМХО, хуже»

Вариант со звёздочкой — надёжнее. Только в маске я не уверен (про жёсткое количество «?», впрочем, я уже не помню форматы построения имён Кщнсультант+).

alpap 19-06-2019 08:41 2876082

а я, вероятно, сделал бы нечто среднее от кодов 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.

Время: 23:22.
© OSzone.net 2001-