从zip文件获取文件名

时间:2014-02-04 14:21:56

标签: batch-file for-loop 7zip

我想创建一个小脚本来解析Mapfiles.zip及其内容之后的目录。 目前我很喜欢多for循环。我想做的就是列出zip内容并获取文件名并插入zip文件旁边的version.txt。 例如

Path = z:\sdfasdf\asdgdfg\njfds\Mapfiles.zip
Content:

2014-01-13 21:06:28 .....      8821287      1503025  9.10.25.359333.2014_01_13_21_06_28.txt
2014-01-13 21:07:32 .....      8821287      1503025  9.10.25.359333.2014_01_13_21_07_30.txt

所以最终的目标是z:\ sdfasdf \ asdgdfg \ njfds \ version.txt应该包含'9.10.25.359333'

@echo off
setlocal
FOR /F "tokens=* delims=" %%A in ('dir /b /s z:\sdfasdf\asdgdfg\njfds\*.zip') do (
for /f "delims=" %%a in ('dir /S /b %%A') do ( set path2=%%a 
)
set path2=%path2:Mapfiles.zip=''%
for /f "delims=" %%b in ('7z.exe l "%%A" | findstr "iGO" ') do (
set var1=%%b
set var1=%var1:~54,-3%
)
echo.%var1%
)
)

我该怎么做呢?

2 个答案:

答案 0 :(得分:1)

您需要使用var > file打印出echo结果 或者,在文件末尾加倍add(whitout replace)。

现在,使用tokens& delims您实际上可以“拆分”每一行,并查看您的条件是否与findstr匹配 例如:

@echo off
for /f "tokens=1,3 delims= " %%g in ('7z.exe l -slt %file%') do (
  echo.%%g | findstr /b /c:"Path" 1>nul
  if NOT errorlevel 1 (
      echo.%%h >> list.txt
  )
)
  • l -slt告诉7z显示“显示技术信息”
  • tokens=1,3令牌1和3捕获第一个和第三个
  • delims= Delims by“space”就是我们将在这里使用的
  • findstr /b在“g”(第一个标记)的开头(/ b)找到“路径”
  • /c:Path我们在第一个标记中查找“Path”,因为是如何在7z列表中启动包含文件名的行。
  • errorlevel找不到字符串时为1,所以......
  • var >> file.txt打印到“list.txt”,但只打印文件名(第二个标记)
  • %%h注意我们为第二个标记设置相关字母,如果以g开头,那么下一个是h

现在,您必须在文件名,空格或任何想要过滤的内容中使用可能的特殊字符。

更多信息:

希望它有所帮助。

答案 1 :(得分:0)

PowerShell还可用于列出zip文件内容的本机解决方案。只需替换示例命令中的Test.zip即可查看其工作原理:

for /f "skip=3 delims=" %A in ('PowerShell -NoProfile -ExecutionPolicy RemoteSigned -Command "$sh = (new-object -com shell.application); $zp = ($sh.NameSpace('"Test.zip"')); $zp.Items() | Select-Object Path"') do @echo %A