批处理脚本帮助请求:如何查找换行符?

时间:2015-10-14 08:32:29

标签: batch-file find findstr

我有一堆包含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

我想如果我调整我的脚本以找到第一个换行符后跟" .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 \ n"在 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 个答案:

答案 0 :(得分: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 循环处理,以便在将包含-------------------的行与存档文件名一起写入内容文本文件后,从第一行获取文件名。< / p>

列表上方的行数不是常数,这就是 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" /?