Вот моя ситуация. Проект имеет как цель переместить некоторые вложения в другую систему.
Эти вложения будут расположены к родительской папке, скажем,"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
подпапка, затем, это хочет создать aFile5
подпапка в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 ^^
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
Идеи кто-либо?
Мое предположение - то, что это роет одну иерархию каталогов за один раз. Вот соглашение. Полагайте, что у нас есть a Folder A
в Folder 1
(Папка 1\Folder А), затем, это ищет от Folder 1
через Folder 5
, и возвращается к Folder 1\Folder A
, где %subfolder переменная % придерживается своего последнего значения.
Чья-либо справка с благодарностью ценится.
Я не очень хорошо знаком с опциями командной строки 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
Код ниже извлечет Папка A\File 1.zip
в новую папку Папка A\File 1
.
Несколько моментов, о которых следует помнить:
FOR
нужно, чтобы %ROOT%
был заключен в двойные кавычки для работы с папками с пробелами в имени. SET
тируете переменную внутри второго FOR
, вам нужно поместить SETLOCAL ENABLEDELAYEDEXPANSION
в начало. Затем ссылайтесь на переменную с помощью ! (например, !subfolder!
) для принудительного расширения во время выполнения. set subfolder=~n%f
должна быть такой set subfolder=%%~nf
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