Лучший вариант найти последние цифры в позиции строки с битой - PullRequest
0 голосов
/ 02 июня 2018

У меня есть несколько случаев, когда строка может принимать разные значения:

foto_20180601_1.jpg foto_20180601_10.jpg foto_20180601_100.jpg foto_20180601_1000.jpg

Если я хочу получить последнюю цифру в этих строках (1, 10, 100, 1000), я могу сделать:

set var=%string:~14% (returns 1.jpg | 10.jpg | 100.jpg | 1000.jpg)
set mystring=%var:.jpg=% (removes '.jpg' and returns the number)

Итак, я хочу знать, есть ли какой-нибудь улучшенный способ, которым я могу использовать findstr, используя regex, чтобы получить эти числа тоже.

Я пробовал с чем-токак это, но не могу получить это:

set string=foto_20180601_100.jpg
for %%f in ("%string:\=" "%") do for /f %%n in ('echo %%f^|findstr /b /e /r "*[0-9]*.jpg"') do (
    echo %%~n
)

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Как насчет этого:

set "STRING=foto_20180601_100.jpg"
for %%I in ("%STRING:_=\%") do echo %%~nI

Это заменяет каждый _ на \, в результате чего имя файла отображается как относительный путь к циклу for;модификатор ~n переменной for извлекает чистое имя последнего элемента, который является интересующей частью.

Чтобы проверить, является ли извлеченная часть чисто числовой, вы можете сделать следующее:

set "STRING=foto_20180601_100.jpg"
for %%I in ("%STRING:_=\%") do (
    (for /F "delims=0123456789 eol=0" %%J in ("%%~nI") do rem/) && (
        echo %%~nI is NOT numeric
    ) || (
        echo %%~nI is purely numeric
    )
)
0 голосов
/ 02 июня 2018

Редактировать Новый вариант вашего примера

@Echo off
set string=foto_20180601_100.jpg
for %%f in (%string:_= %) do for /f "delims=." %%n in (
    'echo %%f^|findstr /i "^[0-9]*.jpg$" ') do echo %%~n

100

Изменение вашего последнего примера (и использование подсказки aschipfl )

@Echo off
set string=foto_20180601_100.jpg
for %%f in (%string:_= %) do Set "Last=%%~nf"
Set Last

Пример вывода:

Last=100

Пример PowerShell

> ls foto*
    Verzeichnis: A:\

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2018-06-02     00:26              2 foto_20180601_1.jpg
-a----       2018-06-02     00:26              2 foto_20180601_10.jpg
-a----       2018-06-02     00:26              2 foto_20180601_100.jpg
-a----       2018-06-02     00:26              2 foto_20180601_1000.jpg

PoSh 00:43:49 A:\______________________________________________________
> ls "foto_*_*.jpg"|? Basename -match 'foto_\d{8}_(\d+)'|%{$matches[1]}
1
10
100
1000
...