遍历批处理文件中的文件夹和文件? [英] Iterating through folders and files in batch file?

查看:41
本文介绍了遍历批处理文件中的文件夹和文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的情况.一个项目的目标是将一些附件迁移到另一个系统.

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 并提取 File5code>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 get File5, creates a subfolder File5 and extract the File5.zip to File5 subfolder, then, it wants to create a File5 subfolder in Folder 1, where it should instead want to create File1 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 1Folder5,然后返回到 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.

需要牢记的几点:

  1. 在第一个 FOR 循环中,您需要将 %ROOT% 括在双引号中以处理名称中包含空格的文件夹.
  2. 由于您要在第二个 FORSET设置一个变量,因此您需要将 SETLOCAL ENABLEDELAYEDEXPANSION 放在开头.然后,使用 !(例如,!subfolder!)在运行时强制展开.
  3. 这行代码 set subfolder=~n%f 应该是这个 set subfolder=%%~nf
  4. 我将 ECHO 放在 MKDIR7za.exe 命令前面进行测试.一旦您确定它正在执行您想要的操作,请删除 ECHO 语句.
  1. In the first FOR loop, you need to have %ROOT% enclosed in double quotes to handle folders with spaces in the name.
  2. Since you're SETting a variable inside the second FOR, you need to put SETLOCAL ENABLEDELAYEDEXPANSION at the beginning. Then, reference the variable using ! (for example, !subfolder!) to force expansion at runtime.
  3. This line of your code set subfolder=~n%f should be this set subfolder=%%~nf
  4. I put ECHO in front of the MKDIR and 7za.exe commands to test. Once you are sure it is doing what you want, remove the ECHO 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆