Перебирать папки и файлы в командном файле? - PullRequest
5 голосов
/ 08 июня 2010

Вот моя ситуация. Цель проекта - перенести некоторые вложения в другую систему.

Эти вложения будут расположены в родительской папке, скажем, "Folder 0" (см. диаграмму этого вопроса для лучшего понимания), и они будут сжаты / сжаты.

Я хочу, чтобы мой пакетный скрипт назывался так:

BatchScript.bat "c:\temp\usd\Folder 0"

Я использую 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

Я полагаю, что мне также нужно изменить фактический каталог перед вызовом 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

Идеи кому-нибудь?

Я предполагаю, что он копает одну иерархию каталогов за раз. Вот сделка. Предположим, у нас есть Folder A в Folder 1 (Папка 1 \ Папка A), затем он выполняет поиск от Folder 1 до Folder 5 и возвращается к Folder 1\Folder A, где переменная% subfolder% остается с последним значение.

Любая помощь с благодарностью.

1 Ответ

8 голосов
/ 09 июня 2010

Я не очень хорошо знаком с параметрами командной строки 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
  )
)  


Запустите это так:

MyScript.CMD "c:\temp\usd\Folder 0"

Вы должны получить вывод, похожий на этот:

Folder A
  File 1.zip
  File 2.zip
Folder B
  File 1.zip
  File 2.zip  


UPDATE

Приведенный ниже код извлечет Folder A\File 1.zip в новую папку Folder A\File 1.

Несколько вещей, которые нужно иметь в виду:

  1. В первом цикле FOR необходимо иметь %ROOT%, заключенный в двойные кавычки для обработки папок с пробелами в имени.
  2. Поскольку вы SET задаете переменную во втором FOR, вам нужно поставить SETLOCAL ENABLEDELAYEDEXPANSION в начале. Затем обратитесь к переменной, используя! (например, !subfolder!) для принудительного расширения во время выполнения.
  3. Эта строка вашего кода set subfolder=~n%f должна быть такой set subfolder=%%~nf
  4. Я поставил ECHO перед командами MKDIR и 7za.exe для проверки. Если вы уверены, что делаете то, что хотите, удалите оператор ECHO.

Вот код:

@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
...