Wil*_*ler 5 extract dos 7zip batch-file
这是我的情况.项目的目标是将一些附件迁移到另一个系统.
这些附件将位于父文件夹中,让我们说" Folder 0"(请参阅此问题的图表以便更好地理解),它们将被压缩/压缩.
我希望像这样调用我的批处理脚本:
BatchScript.bat "c:\temp\usd\Folder 0"
Run Code Online (Sandbox Code Playgroud)
我正在使用7za.exe命令行提取工具.
我希望我的批处理脚本要做的是遍历Folder 0""的子文件夹,并将所有包含的ZIP文件解压缩到各自的文件夹中.
提取的文件必须与各自的ZIP文件位于同一文件夹中.因此," File 1.zip"中包含" "中包含的文件Folder 1,等等.
我已经阅读了关于FOR...DO命令的内容Windows XP Professional Product Documentation - Using Batch Files.
这是我的脚本:
@ECHO OFF
FOR /D %folder IN (%%rootFolderCmdLnParam) DO
FOR %zippedFile IN (*.zip) DO 7za.exe e %zippedFile
Run Code Online (Sandbox Code Playgroud)
我想我还需要在调用7za.exe e%zippedFile进行文件提取之前更改实际目录,但我无法弄清楚如何在这个批处理文件中(通过我知道如何在命令行中,即使我知道它是相同的指令"cd").
编辑#1
我已经收到了关于ServerFault同一问题的一些提示.请在此链接中查看答案.
但是,它从根(C :)中提取,而不是从参数文件夹中的给定中提取.
有人有想法吗?
编辑#2
似乎批处理脚本不能充分处理包含空格字符的文件夹和文件名.谁能证实我的想法?
编辑#3
我需要它完全递归,因为我不知道将使用它的目录结构.
编辑#4.a
有了@ aphoria的解决方案,我几乎就在那里!唯一的问题是,它需要说
File5.zip,只检索文件名获取File5,创建一个子文件夹File5并提取File5.zip到File5子文件夹,然后,它想要创建一个File5子文件夹Folder 1,它应该想要创建File1子文件夹,坚持我的例子.
编辑#4.b
根据需要,这是目前的代码:
@echo off
setlocal enableextensions enabledelayedexpansion
rem
rem Display instructions when no parameter is given.
rem
if "%1" equ "" (
echo Syntaxe : od.bat ^<directory mask>^
echo Exemple : od.bat *
goto :Eof
)
rem
rem Setting the PATH environment variable for this batch file for accessing 7za.exe.
rem
path=c:\temp;%PATH%
rem
rem Removing quotes from the given command line parameter path.
rem
set root=%1
set root=%root:~%1
set root=%root:~0,-1%
rem Searching directory structure from root for subfolders and zipfiles, then extracting the zipfiles into a subfolder of the same name as the zipfile.
for /F "delims==" %%d in ('dir /ogne /ad /b /s %root%') do (
echo Traitement du dossier : "%%d"
for /F "delims==" %%f in ('dir /b "%%d\*.zip"') do (
rem Getting filename without extension.
set subfolder=~n%f
mkdir "%%d\%subfolder%"
rem Extracting zipfile content to the newly created folder.
7za.exe e "%%d\%%f" -o"%%d\%subfolder%"
)
)
:Eof
endlocal
Run Code Online (Sandbox Code Playgroud)
想法有人吗?
我的猜测是它一次挖掘一个目录层次结构.这是交易.想想我们有一个Folder A在Folder 1(文件夹1 \文件夹A),然后,将其从搜索Folder 1通过Folder 5,而回来Folder 1\Folder A,那里的子文件夹%%变量棒,其最后的值.
感谢任何人的帮助.
我对7zip命令行选项不是很熟悉,所以你需要弄清楚它的确切命令,但是下面的脚本将采用一个完全指定的路径(允许空格)并打印出文件夹名称和.包含在其中的zip文件.
@ECHO OFF
REM
REM Remove the double quotes from the front and end of the root path
REM
SET ROOT=%1
SET ROOT=%ROOT:~1%
SET ROOT=%ROOT:~0,-1%
ECHO %ROOT%
FOR /F "DELIMS==" %%d in ('DIR "%ROOT%" /AD /B') DO (
ECHO %%d
FOR /F "DELIMS==" %%f in ('DIR "%ROOT%\%%d\*.zip" /B') DO (
ECHO %%f
)
)
Run Code Online (Sandbox Code Playgroud)
像这样运行:
MyScript.CMD "c:\temp\usd\Folder 0"
您应该获得类似于此的输出:
Folder A
File 1.zip
File 2.zip
Folder B
File 1.zip
File 2.zip
Run Code Online (Sandbox Code Playgroud)
下面的代码将解压缩Folder A\File 1.zip到一个新文件夹Folder A\File 1.
要记住以下几点:
FOR循环中,您需要%ROOT%用双引号括起来处理名称中带有空格的文件夹.SET第二个内部变量FOR,你需要SETLOCAL ENABLEDELAYEDEXPANSION在开头.然后,使用引用变量!(例如,!subfolder!)在运行时强制扩展.set subfolder=~n%f应该是这样的set subfolder=%%~nfECHO前面进行测试.一旦确定它正在执行您想要的操作,请删除该语句. MKDIR7za.exeECHO这是代码:
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
REM
REM Remove the double quotes from the front and end of the root path
REM
SET ROOT=%1
SET ROOT=%ROOT:~1%
SET ROOT=%ROOT:~0,-1%
ECHO %ROOT%
REM Searching directory structure from root for subfolders and zipfiles,
REM then extracting the zipfiles into a subfolder of the same name as the zipfile.
FOR /F "delims==" %%d IN ('dir /ogne /ad /b /s "%ROOT%"') DO (
ECHO Traitement du dossier : "%%d"
FOR /F "delims==" %%f IN ('dir /b "%%d\*.zip"') DO (
REM Getting filename without extension.
SET subfolder=%%~nf
ECHO mkdir "%%d\!subfolder!"
REM Extracting zipfile content to the newly created folder.
ECHO 7za.exe e "%%d\%%f" -o"%%d\!subfolder!"
)
)
ENDLOCAL
Run Code Online (Sandbox Code Playgroud)