2015-10-14 65 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" /?