2015-10-14 2 views
0

У меня есть группа RAR-файлов, содержащих JPG, и я пытаюсь получить имя первого файла каждого RAR-файла.Запрос справки по пакетному сценарию: как найти разрыв строки?

Например, если я бег 7z l -r abc.rar, я хотел бы получить это первый файл 01.jpg

path = xyz.rar 
Type = zip 
Physical Size = 15430338 

    Date  Time Attr   Size Compressed Name 
------------------- ----- ------------ ------------ ------------------------ 
2003-03-06 13:32:44 ....A  330433  325405 01.jpg 
2003-03-06 13:34:08 ....A  301098  291857 02.jpg 
2003-03-06 13:34:14 ....A  257770  244619 03.jpg 
2003-03-06 13:34:22 ....A  301220  292019 04.jpg 
2003-03-06 13:34:30 ....A  326989  316380 05.jpg 

До сих пор, со следующим пакетным сценарием, я могу раздеться метаданными команды 7z и получить список файлов в файле contents.txt.

set PATH=%PATH%;"C:\Program Files\7-Zip" 

for %%f in ("*.*") do (
    echo "%%f" >> contents.txt 
    echo. 

    7z l -r "%%f" | FIND /V "ing " | FIND /V "Igor Pavlov" | FIND /V "--" | FIND /V "Path" | FIND /V "Type" | FIND /V "Solid" | FIND /V "Blocks" | FIND /V "Multivolume" | FIND /V "Volumes" | FIND /V "Date" | FIND /V "---" | FIND /V "Physical Size" | FINDSTR /R /E ".jpg" >> contents.txt 

    echo. 
) 
PAUSE 

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

"abc.rar" 
2003-03-26 01:18:50 ....A  331711  330648 01.jpg 
2003-03-26 01:18:54 ....A  271173  270942 02.jpg 

"xyz.rar" 
2003-07-08 22:40:56 ....A  445799  430058 p00.jpg 
2003-07-08 22:40:40 ....A  181324  142554 p01.jpg 
2003-07-08 22:40:42 ....A  384901  370140 p02.jpg 

"efg.rar" 
2003-07-08 22:42:54 ....A  156436  115275 xy01abc.jpg 
2003-07-08 22:42:58 ....A  456633  448240 xy02abc.jpg 
2003-07-08 22:42:58 ....A  355114  339026 xy03abc.jpg 
2003-07-08 22:42:58 ....A  355114  339026 xy04abc.jpg 

Я думаю, если я настроить мой сценарий, чтобы найти первый разрыв строки, за которой следует «.jpg» на выходе 7z, я могу получить имя файла в следующий формат:

"abc.rar" 
2003-03-26 01:18:50 ....A  331711  330648 01.jpg 

"xyz.rar" 
2003-07-08 22:40:56 ....A  445799  430058 p00.jpg 

"efg.rar" 
2003-07-08 22:42:54 ....A  156436  115275 xy01abc.jpg 

Но я не знаю, как искать разрыв строки в команде FINDSTR. Я пытался найти для ".jpg \ п" в Findstr:

7z l -r "%%f" | FIND /V "ing " | FIND /V "Igor Pavlov" | FIND /V "--" | FIND /V "Path" | FIND /V "Type" | FIND /V "Solid" | FIND /V "Blocks" | FIND /V "Multivolume" | FIND /V "Volumes" | FIND /V "Date" | FIND /V "---" | FIND /V "Physical Size" | FINDSTR /R /E ".jpg\n" >> contents.txt 

Но это не сработало.

Может ли кто-нибудь мне помочь?

Мой требуемый выход раздеться всю информацию о размере даты и файла с выхода имени файла и добавить его после имени RAR файла, такие как:

"abc.rar" 01.jpg 

"xyz.rar" p00.jpg 

"efg.rar" xy01abc.jpg 

Там нет фиксированного шаблон первого JPG файл. Некоторые начинают с 00, некоторые с 01, некоторые с текстом и номером (пример x00y.jpg). Я пробовал различные методы поиска имен файлов, которые начинаются с 00 или 01 с текстом и без него (например, в моей команде я использовал FINDSTR /R /E "[a-z][0-1]*.jpg" для поиска имен файлов с текстом и номером, но есть некоторые RAR-файлы без текста в имена файлов).

ответ

1

Выполнение в окне командной строки findstr /? выводит справку для этой команды, перечисляя и объясняя /E для поиска указанной строки в конце строк. Использование этой опции намного проще, чем все остальное, чтобы найти строку в конце строки.


Одним из возможных партии решение для вашей задачи может быть:

@echo off 
del contents.txt 2>nul 
for %%A in ("*.*") do call :GetFirstFileName "%%~A" 
exit /B 

:GetFirstFileName 
"%ProgramFiles%\7-Zip\7z.exe" l "%~1" | %SystemRoot%\System32\findstr.exe /E /I "/C:.jpg">"%TEMP%\FilesList.tmp" 
for /F "usebackq eol=` tokens=5* delims= " %%B in ("%TEMP%\FilesList.tmp") do (
    echo "%~1" %%C>>contents.txt 
    del "%TEMP%\FilesList.tmp" 
    exit /B 
) 
del "%TEMP%\FilesList.tmp" 
exit /B 

Этот пакетный файл вызывает 7-Zip для каждого файла в текущем каталоге в список содержимого архива, который фильтруется Findstr, чтобы получить во временном списке файл только строки, заканчивающиеся на .jpg в любом случае.

Временный файл списка обрабатывается циклом FOR, чтобы получить только имя файла из первой строки, написанной вместе с именем архивного файла, в текстовый файл с содержанием.


Другим решением было бы с помощью FOR непосредственно в список Процесс выхода 7-Zip.

@echo off 
setlocal EnableDelayedExpansion 
del contents.txt 2>nul 
for %%A in ("*.*") do call :GetFirstFileName "%%~A" 
endlocal 
exit /B 

:GetFirstFileName 
set "NextLine=0" 
"%ProgramFiles%\7-Zip\7z.exe" l "%~1">"%TEMP%\FilesList.tmp" 
for /F "usebackq eol=` tokens=1,5* delims= " %%B in ("%TEMP%\FilesList.tmp") do (
    if "%%B" == "-------------------" (
     set "NextLine=1" 
    ) else if "!NextLine!" == "1" (
     echo "%~1" %%D>>contents.txt 
     del "%TEMP%\FilesList.tmp" 
     exit /B 
    ) 
) 
del "%TEMP%\FilesList.tmp" 
exit /B 

Этот пакетный файл вызывает 7-Zip для каждого файла в текущем каталоге, чтобы перечислить содержимое архива перенаправлены во временный файл списка.

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

Количество строк над списком не является постоянным, поэтому ДЛЯ опции skip= не могут быть использованы здесь.

Не имеет значения, какой файл расширения для расширения в архиве имеет для этого пакетного решения.


Еще одним решением является использование бесплатного UnRAR, чтобы получить имя каждого файла архива RAR.

@echo off 
del contents.txt 2>nul 
for %%A in ("*.rar") do call :GetFirstFileName "%%~A" 
exit /B 

:GetFirstFileName 
"%ProgramFiles%\WinRAR\UnRAR.exe" lb "%~1">"%TEMP%\FilesList.tmp" 
for /F "usebackq eol=: delims=" %%B in ("%TEMP%\FilesList.tmp") do (
    echo "%~1" %%B>>contents.txt 
    del "%TEMP%\FilesList.tmp" 
    exit /B 
) 
del "%TEMP%\FilesList.tmp" 
exit /B 

Преимущества заключается в том, что UnRAR поддерживает несколько вариантов формата список, включая голый формат, используемый при использовании команды l с b добавленными. Это упрощает получение первого имени файла.


Для понимания используемых команд и как они работают, откройте окно командной строки, выполните там следующие команды, и читать полностью все справочные страницы отображаются для каждой команды очень тщательно.

  • call /?
  • del /?
  • echo /?
  • endlocal /?
  • exit /?
  • findstr /?
  • for /?
  • if /?
  • set /?
  • setlocal /?
  • "%ProgramFiles%\7-Zip\7z.exe" -?
  • "%ProgramFiles%\WinRAR\UnRAR.exe" /?