遍历批处理文件中的文件夹和文件? [英] Iterating through folders and files in batch file?
问题描述
这是我的情况.一个项目的目标是将一些附件迁移到另一个系统.
Here's my situation. A project has as objective to migrate some attachments to another system.
这些附件将位于父文件夹中,比如Folder 0
"(请参阅这个问题的图表以便更好地理解),它们将被压缩/压缩.
These attachments will be located to a parent folder, let's say "Folder 0
" (see this question's diagram for better understanding), and they will be zipped/compressed.
我希望我的批处理脚本像这样被调用:
I want my batch script to be called like so:
BatchScript.bat "c: empusdFolder 0"
我使用 7za.exe
作为命令行提取工具.
I'm using 7za.exe
as the command line extraction tool.
我希望我的批处理脚本执行的是遍历Folder 0
"的子文件夹,并将所有包含的 ZIP 文件解压缩到它们各自的文件夹中.
What I want my batch script to do is to iterate through the "Folder 0
"'s subfolders, and extract all of the containing ZIP files into their respective folder.
提取的文件必须与其各自的 ZIP 文件位于同一文件夹中.因此,在Folder 1
"等中需要File 1.zip
"中包含的文件.
It is obligatory that the files extracted are in the same folder as their respective ZIP files. So, files contained in "File 1.zip
" are needed in "Folder 1
" and so forth.
我已阅读有关 FOR...DO
命令在 Windows XP Professional 产品文档 - 使用批处理文件
.
I have read about the FOR...DO
command on 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
我想我还需要在调用 7za.exe e %zippedFile 进行文件提取之前更改实际目录,但我无法弄清楚这个批处理文件中的方法(通过我知道命令行中的方法,甚至如果我知道它是相同的指令cd").
I guess that I would also need to change the actual directory before calling 7za.exe e %zippedFile for file extraction, but I can't figure out how in this batch file (through I know how in command line, and even if I know it is the same instruction "cd").
编辑 #1
我已经收到了一些关于 ServerFault
的提示,以解决相同的问题.请在此链接上查看答案.
I have already received some tips on ServerFault
to the same question. Please see the answers at this link.
但是,它是从根目录 (C:) 中提取的,而不是从参数文件夹中给出的.
However, it extracted from the root (C:), and not from the given in parameter folder.
有人有想法吗?
编辑#2
批处理脚本似乎不能充分处理包含空格字符的文件夹和文件名.谁能证实我的想法?
It seems that batch script doesn't handle folder and file names containing a space character adequately. Can anyone confirm what I think?
编辑 #3
我需要它是完全递归的,因为我不知道将使用它的目录结构.
I need it to be fully recursive, since I don't know the directory structure against which this will be used.
编辑 #4.a
有了@aphoria 的解决方案,我就快到了!唯一的问题是它需要让我们说 File5.zip
,检索文件名只是为了获得 File5
,创建一个子文件夹 File5
并提取 File5
code>File5.zip 到 File5
子文件夹,然后,它想在 Folder 1
中创建一个 File5
子文件夹,它应该而是想创建 File1
子文件夹,以坚持我的例子.
With @aphoria's solution, I'm almost there! The only problem is that it takes let's say
File5.zip
, retrieve the filename only to getFile5
, creates a subfolderFile5
and extract theFile5.zip
toFile5
subfolder, then, it wants to create aFile5
subfolder inFolder 1
, where it should instead want to createFile1
subfolder, to stick with my example.
编辑 #4.b
根据需要,这是当前的代码:
As required, here's the code as it currently look:
@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: emp;%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
有人有想法吗?
我的猜测是它一次挖掘一个目录层次结构.这是交易.假设我们在Folder 1
(Folder 1Folder A)中有一个Folder A
,那么它从Folder 1
到Folder5
,然后返回到 Folder 1Folder A
,其中 %subfolder% 变量保持其最后一个值.
My guess is that it digs one directory hierarchy at a time. Here's the deal. Consider we have a Folder A
in Folder 1
(Folder 1Folder A), then, it searches from Folder 1
through Folder 5
, and comes back to Folder 1Folder A
, where the %subfolder% variable sticks with its last value.
感谢任何人的帮助.
推荐答案
我对 7zip 命令行选项不是很熟悉,所以你需要找出确切的命令,但下面的脚本将需要一个完全指定的路径(允许有空格)并打印出其中包含的文件夹名称和 .zip 文件.
I'm not very familiar with the 7zip command-line options, so you will need to figure out the exact command for that, but the script below will take a fully specified path (spaces allowed) and print out the the folder name and .zip files contained within it.
@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 it like this:
MyScript.CMD "c: empusdFolder 0"
你应该得到类似这样的输出:
MyScript.CMD "c: empusdFolder 0"
You should get output similar to this:
Folder A
File 1.zip
File 2.zip
Folder B
File 1.zip
File 2.zip
下面的代码会将Folder AFile 1.zip
解压到一个新文件夹Folder AFile 1
.
The code below will extract Folder AFile 1.zip
to a new folder Folder AFile 1
.
需要牢记的几点:
- 在第一个
FOR
循环中,您需要将%ROOT%
括在双引号中以处理名称中包含空格的文件夹. - 由于您要在第二个
FOR
中SET
设置一个变量,因此您需要将SETLOCAL ENABLEDELAYEDEXPANSION
放在开头.然后,使用 !(例如,!subfolder!
)在运行时强制展开. - 这行代码
set subfolder=~n%f
应该是这个set subfolder=%%~nf
- 我将
ECHO
放在MKDIR
和7za.exe
命令前面进行测试.一旦您确定它正在执行您想要的操作,请删除ECHO
语句.
- In the first
FOR
loop, you need to have%ROOT%
enclosed in double quotes to handle folders with spaces in the name. - Since you're
SET
ting a variable inside the secondFOR
, you need to putSETLOCAL ENABLEDELAYEDEXPANSION
at the beginning. Then, reference the variable using ! (for example,!subfolder!
) to force expansion at runtime. - This line of your code
set subfolder=~n%f
should be thisset subfolder=%%~nf
- I put
ECHO
in front of theMKDIR
and7za.exe
commands to test. Once you are sure it is doing what you want, remove theECHO
statement.
代码如下:
@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
这篇关于遍历批处理文件中的文件夹和文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!