2017-01-11 5 views
1

Я хотел бы отсортировать набор файлов в определенном порядке с помощью командного файла. Файлы должны быть сгруппированы по номеру Floor и отсортированы по строке, которая содержится в имени файла.Сортировка файлов по двум строкам в имени файла: Пакетный файл

Пример некоторых имен файлов заключаются в следующем:

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 номером первым, а затем в следующем порядке:

RSSI 
RSRP 
RSRQ 
SINR 
TX Power 
PCI 

Есть ли способ, которым я могу использовать sort команда, чтобы организовать это?

+1

No.Сортировка не позволит вам создать произвольное, нелогичное упорядочение. Также не будет dir или любой другой команды Windows. Вы можете увидеть, что возможно, используя sort, набрав 'sort /?' В командной строке (то же самое верно для 'dir /?'). Что вы пытаетесь сортировать? Список каталогов? Где вы пытаетесь отобразить отсортированный список? –

+0

Возможно, я могу написать пакетный файл для поиска каждого ключевого слова, RSSI ... PCI и добавить числовое значение (01, 02 ...) до этого имени. Это должно сортировать все в том порядке, в котором я нуждаюсь. Я пытался отсортировать список файлов в этом конкретном порядке, потому что, когда я конвертирую все эти JPG в один файл с несколькими файлами, он будет в том порядке, в котором он мне понадобится, после преобразования в формат PDF. @KenWhite –

+1

Итак, не можете ли вы поместить имена файлов в текстовый файл, отсортировать его, как вы хотите, в этом текстовом файле, а затем обработать этот текстовый файл, используя 'for/f', чтобы передать ваш конвертер файлы в правильном порядке? –

ответ

2

Я не использовал для отправки кода, когда ОП не опубликовал его собственные усилия. Однако, эта проблема весьма интересна для меня, так вот это решение:

@echo off 
setlocal EnableDelayedExpansion 

set "order=RSSI RSRP RSRQ SINR "Tx Power" PCI" 

rem Extract the "order" string into individual numerated elements 
set "i=0" 
for %%a in (%order%) do (
    set /A i+=1 
    set "order[%%~a]=!i!" 
) 

rem Process the files and create an array with the desired order 
set "lastFloor=0" 
for /F "tokens=1-5 delims=_" %%a in ('dir /A:-D /B *.jpg') do (
    set "name[%%b][!order[%%d]!]=%%a_%%b_%%c_%%d_%%e" 
    if %%b gtr !lastFloor! set "lastFloor=%%b" 
) 

rem Process the array elements 
for /L %%i in (1,1,%lastFloor%) do (
    for /F "tokens=2 delims==" %%a in ('set name[%%i]') do echo %%a 
) 

Выхода:

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 

Вы можете просмотреть управление массивом в пакетных файлах на this answer.

+0

Прошу прощения, я не знаю много сценариев и не знал, с чего начать. Я пытаюсь учиться на этом сайте, а теперь, из вашего опубликованного кода. Спасибо. У меня есть несколько вопросов, я начну с первого; как этот скрипт знает, какой путь к каталогу установлен? могу ли я изменить его с помощью команды «set/p path = Directory Path:», а затем вызвать его с помощью% path%? –

3
@echo off 
    setlocal enableextensions disabledelayedexpansion 

    rem Retrieve folder from command line. By default current folder 
    for %%a in ("%~f1.") do set "folder=%%~fa" 

    rem Configure the order of the files 
    set /a "RSSI=1", "RSRP=2", "RSRQ=3", "SINR=4", "Tx=5", "PCI=6" 

    rem %%f - For each file in the indicated folder 
    rem  %%a %%b %%c - Separate the elements of the file name 
    rem  Use the elements to generate a serial number for the file 
    rem  Output the serial number and the file name 
    rem Pipe the generated list into sort to sort on serial number 
    rem %%d Retrieve the sorted list 
    rem  separate serial number and file name 
    rem  output file name 

    (
     for %%f in ("%folder%\Floor*") do @(
      for /f "tokens=2,4 delims=_" %%a in ("%%~nxf") do @for /f %%c in ("%%b") do @(
       set /a 10000000+%%a*100000+%%c 
       echo(%%~nxf 
      ) 
     ) 
    ) | sort | for /f "tokens=1,*" %%d in ('findstr "^"') do @echo(%%e 

Выход

W:\41597911>dir /B *.jpg 
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 

W:\41597911>sortFiles.cmd 
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   
+0

Спасибо, это очень читаемо. Я верю, что следую. сохраняя этот скрипт в пути к папке и вызывая его с помощью CMD sort001.bat/k. Я вижу, что он эхо-файлы, я знаю, что могу изменить свой код, чтобы писать в текстовый файл, если это необходимо. Но он не сортируется по мере необходимости, он просто повторяет имена в формате сортировки, в котором он первоначально находился. Кроме того, как это сортирует файлы в окне проводника? –

+0

@JamesHayek. В моем случае с файлами, хранящимися в разделе NTFS, ОС по умолчанию извлекает lis, отсортированный по имени. Сценарий выводит файлы в порядке, указанном начальными переменными, но это не изменит способ сортировки файлов в окне проводника. Explorer использует собственный код сортировки, основанный на выборе столбцов. Вы можете изменить физический порядок файлов в разделе FAT, но не на NTFS, но исследователь все равно будет использовать его собственный код. –

0

Вот другой подход, который использует временный файл; это содержит список совпадающих имен файлов, которые читаются несколько раз, по одному ключевому слову 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 
Смежные вопросы