Вот другой подход, который использует временный файл; это содержит список совпадающих имен файлов, которые читаются несколько раз, по одному ключевому слову RSSI
, RSRP
, RSRQ
, SINR
, TX Power
и PCI
(чтение из файла лучше, чем создание списка файлов с точки зрения производительности). Вот код:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "_FILES=.\Floor_*_*_*_*.jpg" & rem // (location and pattern of files to be sorted)
rem // Create temporary file containing list of all matching file names:
> "%~dpn0.tmp" (
rem // Capture filtered list of files and split them into `_`-separated tokens:
for /F "tokens=1-4* delims=_" %%A in ('
dir /B /A:-D /O:N "%_FILES%" ^| ^(
rem/ Filter for files whose names match the given pattern: ^&^
findstr /R /I /C:"^Floor_[0-9][0-9]*_[^_][^_]*_[A-Z ][A-Z ]*_[^_].*\.jpg$"
^)
') do (
rem // Pad floor number with leading zeroes:
set "NUM=0000%%B"
rem /* Store floor number prefix in variable named `$FLOOR_`, followed by
rem four-digit floor number, to get a list of unique floor numbers: */
call set "$FLOOR_%%NUM:~-4%%=%%A_%%B"
rem // Write original file name into temporary file:
echo(%%A_%%B_%%C_%%D_%%E
)
)
rem /* Loop over the unique floor numbers by retrieving a sorted list of all variables
rem whose names begin with `$FLOOR_`; the following zero-padded four-digit floor
rem number ensures ascending numerical sort order (sorted by `set` implicitly): */
for /F "tokens=1,* delims==" %%E in ('2^> nul set $FLOOR_') do (
rem /* Return file names from temporary file holding the currently iterated floor
rem number with the special keywords (fourth token) in the proposed order: */
findstr /R /I /C:"^%%F_[^_][^_]*_RSSI_" "%~dpn0.tmp"
findstr /R /I /C:"^%%F_[^_][^_]*_RSRP_" "%~dpn0.tmp"
findstr /R /I /C:"^%%F_[^_][^_]*_RSRQ_" "%~dpn0.tmp"
findstr /R /I /C:"^%%F_[^_][^_]*_SINR_" "%~dpn0.tmp"
findstr /R /I /C:"^%%F_[^_][^_]*_TX Power_" "%~dpn0.tmp"
findstr /R /I /C:"^%%F_[^_][^_]*_PCI_" "%~dpn0.tmp"
)
rem // Delete temporary file:
del "%~dpn0.tmp"
endlocal
exit /B
Опираясь на ваш пример данных, вышеупомянутый временный файл содержит следующий список:
Floor_1_SomeName_PCI_Some Trailing Text.JPG
Floor_1_SomeName_RSRP_Some Trailing Text.JPG
Floor_1_SomeName_RSRQ_Some Trailing Text.JPG
Floor_1_SomeName_RSSI_Some Trailing Text.JPG
Floor_1_SomeName_SINR_Some Trailing Text.JPG
Floor_1_SomeName_TX Power_Some Trailing Text.JPG
Floor_2_SomeName_PCI_Some Trailing Text.JPG
Floor_2_SomeName_RSRP_Some Trailing Text.JPG
Floor_2_SomeName_RSRQ_Some Trailing Text.JPG
Floor_2_SomeName_RSSI_Some Trailing Text.JPG
Floor_2_SomeName_SINR_Some Trailing Text.JPG
Floor_2_SomeName_TX Power_Some Trailing Text.JPG
Для каждого уникального напольного префикса, состоящего из Floor_
и числа, в приведенном выше списке выполняется поиск предопределенных ключевых слов один за другим в предлагаемом порядке. Чтобы получить все уникальные префиксы для пола, используется массивный набор переменных с именем $FLOOR_
, за которым следует номер пола, соответствующие значения которого содержат префикс пола, как они появляются в именах файлов. Для этих префиксов появляются отсортированными в буквенно-цифровой форме, номер этажа в именах переменных являются нулями до четырех цифр:
$FLOOR_0001=Floor_1
$FLOOR_0002=Floor_2
Окончательно возвращаемый результат будет таким:
Floor_1_SomeName_RSSI_Some Trailing Text.JPG
Floor_1_SomeName_RSRP_Some Trailing Text.JPG
Floor_1_SomeName_RSRQ_Some Trailing Text.JPG
Floor_1_SomeName_SINR_Some Trailing Text.JPG
Floor_1_SomeName_TX Power_Some Trailing Text.JPG
Floor_1_SomeName_PCI_Some Trailing Text.JPG
Floor_2_SomeName_RSSI_Some Trailing Text.JPG
Floor_2_SomeName_RSRP_Some Trailing Text.JPG
Floor_2_SomeName_RSRQ_Some Trailing Text.JPG
Floor_2_SomeName_SINR_Some Trailing Text.JPG
Floor_2_SomeName_TX Power_Some Trailing Text.JPG
Floor_2_SomeName_PCI_Some Trailing Text.JPG
No.Сортировка не позволит вам создать произвольное, нелогичное упорядочение. Также не будет dir или любой другой команды Windows. Вы можете увидеть, что возможно, используя sort, набрав 'sort /?' В командной строке (то же самое верно для 'dir /?'). Что вы пытаетесь сортировать? Список каталогов? Где вы пытаетесь отобразить отсортированный список? –
Возможно, я могу написать пакетный файл для поиска каждого ключевого слова, RSSI ... PCI и добавить числовое значение (01, 02 ...) до этого имени. Это должно сортировать все в том порядке, в котором я нуждаюсь. Я пытался отсортировать список файлов в этом конкретном порядке, потому что, когда я конвертирую все эти JPG в один файл с несколькими файлами, он будет в том порядке, в котором он мне понадобится, после преобразования в формат PDF. @KenWhite –
Итак, не можете ли вы поместить имена файлов в текстовый файл, отсортировать его, как вы хотите, в этом текстовом файле, а затем обработать этот текстовый файл, используя 'for/f', чтобы передать ваш конвертер файлы в правильном порядке? –