我有一堆包含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文件。
答案 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" /?