Войти

Показать полную графическую версию : распаковать все файлы с расширением 7z в каталог, содержащий текущую дату


Sylest
21-03-2012, 20:42
Здравствуйте.

Требуется помощь в написании bat-файл.

Задача: из заданного в командной строке каталога распаковать все файлы с расширением 7z в каталог, содержащий текущую дату. Используя цикл FOR, ввести проверку ошибок: в каталоге нет ни одного файла с расширением 7z.

Своими силами написал следующий код код:
cls
set exist=1
for %%f in ("%USERPROFILE%"\"Рабочий стол"\bat\batnik.7z) do "C:\Program Files\7-Zip\7z.exe" x %1 -oc:\mybatcatalog\"%date%"
set exist=0
if %exist%==0 echo Нет ни одного файла с расширением 7z
По какой-то причине, в написанном не происходит проверка по условию (наличие архива в каталоге).


Заранее благодарен.

P.S. Требуется реализация именно через for, ни как иначе.

Iska
21-03-2012, 21:52
в каталог, содержащий текущую дату »
А где должен располагаться сам этот каталог? В текущем?

Примерно так (если не брать извращения с проверкой наличия файлов по «for» вместо «exist»):
@echo off
setlocal enableextensions enabledelayedexpansion

set sFolder=%~1

if defined sFolder (
if exist "%sFolder%\*.7z" (
call :GetPathTo7Zip

if defined PathTo7Zip (
if exist "!PathTo7Zip!7z.exe" (
"!PathTo7Zip!7z.exe" x "%sFolder%\*.7z" -o%date% -y *
) else (
echo Can't find 7-Zip executive in [!PathTo7Zip!]
)
) else (
echo Can't find path to 7-Zip executive
)
) else (
echo Not found any 7-zip archivies in [%sFolder%]
)
) else (
echo Usage: %~nx0 ^<Path^>
)

endlocal
exit /b 0

:GetPathTo7Zip
setlocal enableextensions enabledelayedexpansion
set sOut=%~0

for /f "usebackq tokens=3 delims= " %%i in (
`reg.exe query "HKEY_LOCAL_MACHINE\SOFTWARE\7-Zip" /v "Path" 2^>nul ^| find.exe /i "Path"`
) do set sPath=%%i

endlocal & set %sOut:~4%=%sPath%
exit /b

Sylest
21-03-2012, 22:06
А где должен располагаться сам этот каталог?
Самостоятельно задаем в bat-файле каталог, в котором будет создан новый. Но можно выполнить и в текущем.

если не брать извращения с проверкой наличия файлов по «for» вместо «exist»
К сожалению с for - это обязательное условие.

Iska
22-03-2012, 01:59
Я даже не особо представляю, как сие может выглядеть. Ну, давайте попробуем прикрутить «for» искусственно, например:
@echo off
setlocal enableextensions enabledelayedexpansion

set sFolder=%~1

call :GetPathTo7Zip

if defined sFolder (
if defined PathTo7Zip (
if exist "%PathTo7Zip%7z.exe" (
(
for %%i in ("%sFolder%\*.7z") do "%PathTo7Zip%7z.exe" x "%%~fi" -o%date% -y *
) || echo Not found any 7-zip archivies in [%sFolder%]
) else (
echo Can't find 7-Zip executive in [%PathTo7Zip%]
)
) else (
echo Can't find path to 7-Zip executive
)
) else (
echo Usage: %~nx0 ^<Path^>
)

endlocal
exit /b 0

:GetPathTo7Zip
setlocal enableextensions enabledelayedexpansion
set sOut=%~0

for /f "usebackq tokens=3 delims= " %%i in (
`reg.exe query "HKEY_LOCAL_MACHINE\SOFTWARE\7-Zip" /v "Path" 2^>nul ^| find.exe /i "Path"`
) do set sPath=%%i

endlocal & set %sOut:~4%=%sPath%
exit /b

gora
22-03-2012, 10:16
Iska
1 Добавил в конец Pause, иначе не мог увидеть сообщений
2 Запуск батника производил без параметров, поэтому исправил (только для тестов) строкуset sFolder=%~dp0
2.1 На Win7 x64 получил Can't find path to 7-Zip executive хотя 7-Zip у меня разумеется стоит и ключи на месте.
2.2 На Win XP получил Can't find 7-Zip executive in [c:\Program Files\7-Zip] Причина: разные инсталляторы 7-Zip по разному пишут путь в реестр, msi пишут с завершающим слешем, а exe без оного.
3 Присвоение переменной %PathTo7Zip% оригинально, но для начинающих будет непонятно. К тому же при любом (без знаний метода формирования переменной) изменении имени переменной и\или имени п\п :GetPathTo7Zip приведет к непредсказуемым результатам.
4 После того как подправил получение пути батник заработал, но...
4.1 При отсутствии архивов в папке сообщение Not found any 7-zip archivies in [%sFolder%] не вывелось
4.2 После добавления в папку запароленного архива (получилось это случайно), батник на нем остановился для ввода пароля. Ввел неправильный пароль (правильный просто не помню) и получил сообщение Not found any 7-zip archivies in [E:\Temp\]
4.2.1 Но если этот запароленный архив не будет последним в списке обрабатываемых архивов, то сообщение снова не выводится

Немного подправил Ваш вариант и получилось это:@Echo Off
Setlocal EnableExtensions

Set sFolder=%~1
:: Set sFolder=%~dp0
Set "flag="
Set "PathTo7Zip="

If Not Defined sFolder Call :_abort "Usage: %~nx0 [Path]"
If "%sFolder:~-1%"=="\" Set sFolder=%sFolder:~0,-1%
For %%i In ("%sFolder%\*.7z") Do Set flag=1
If Not Defined flag Call :_abort "Not found any 7-zip archivies in [%sFolder%]"
For /f "tokens=2*" %%i In ('Reg Query "HKEY_LOCAL_MACHINE\SOFTWARE\7-Zip" /v "Path" 2^>nul') Do Set PathTo7Zip=%%j
If Not Defined PathTo7Zip Call :_abort "Can't find path to 7-Zip executive"
If Not "%PathTo7Zip:~-1%"=="\" Set PathTo7Zip=%PathTo7Zip%\
If Not Exist "%PathTo7Zip%7z.exe" Call :_abort "Can't find 7-Zip executive in [%PathTo7Zip%]"
For %%i In ("%sFolder%\*.7z") Do "%PathTo7Zip%7z.exe" x "%%~fi" -o%date% -y -ppassword>nul
Call :_abort "Unpacking is complete"

:_abort
Echo.
Echo %~1
Echo.
Pause
Endlocal
Exit




© OSzone.net 2001-2012