2015-10-14 51 views
0

我有一堆包含JPG的RAR文件,我試圖獲取每個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 

我想如果我調整我的劇本找到第一個換行符之後在7z格式輸出「.JPG」,我可以在第一個文件名格式如下:

"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命令行。我試着在FINDSTR找到 「.JPG \ N」:

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循環處理含-------------------與歸檔文件的名字寫在一起爲內容的文本文件中的行之後,從第一行得到的只是文件名。

上面的列表中的行數不恆定這就是爲什麼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支持幾種選項列表格式包括使用與b所附命令l時所使用的空格式。這使得獲取第一個文件名變得更容易。


對於理解使用的命令以及它們如何工作,打開命令提示符窗口中,執行有下面的命令,並完全讀取顯示每個命令的所有幫助頁面非常謹慎。

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