Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Нужна помощь в написании скрипта работы с файлами.

Ответить
Настройки темы
CMD/BAT - [решено] Нужна помощь в написании скрипта работы с файлами.

Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


Доброго времени суток господа форумчане! Требуется помощь в написании скрипта. Имеем следующее : программа 3D съемки дает на выходе 32 .jpg файла в папку с рандомным названием (эта папка создается всегда в одном месте скажем в D:/Photo) . Задача состоит в том , что бы переименовать эти .jpg фалы по очереди , начиная с 0 до 31(тоесть должно получиться 0.jpg.....31.jpg) и запаковать их в архив с помощью 7zip под названием photo.zip . Заранее спасибо за помощь.

Отправлено: 09:28, 20-08-2019

 

Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


nik123456654321, в D:/Photo папка с рандомным названием единственная? Или надо обработать все папки? Что делать с файлами после упаковки? В каком порядке присваиваются номера (по дате/времени изменения?) Не лучше ли именовать файлы 00.jpg 01.jpg ...09.jpg 10.jpg 11.jpg... 31.jpg Куда девать файл photo.zip?

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 09:47, 20-08-2019 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


megaloman, Здравствуйте,спасибо , что откликнулись ! Да папка будет единственная . После упаковки файлы будут загружаться на ftp сайта (но это уже другая история ). Номера присваиваются по дате создания я думаю (т.е. делаются последовательно 32 фото и их так же по порядку создания надо переименовывать начиная с 0 и до 31 ). С названием файлов ,к сожалению, они должны именоваться именно с 0.jpg и т.д. (это требования скрипта , который потом из них разворачивает 3D модель на сайте ). Photo.zip можно положить в туже корневую папку рядом (вместо ) папки с рандомным названием.

Отправлено: 10:52, 20-08-2019 | #3


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


nik123456654321,
Код: Выделить весь код
@Echo Off
cls
	Set "BoxIn=D:\Photo"
	Set "Mask=*.jpg"
	Set "FileOut=D:\Photo\Photo.zip"

	Set "Arc="C:\Program Files\7-Zip\7z.exe" a -mx5 -sdel --"

	Set /A NContr=32

	If Not Exist "%BoxIn%\" (Echo !!! Folder "%BoxIn%\" not exists. Script Exit. &Pause &Exit /B 2)
	If Exist "%FileOut%" (Echo !!! File "%FileOut%" already exists. Script Exit. &Pause &Exit /B 2)

	Set /A N=0
	FOR /F "usebackq delims=" %%d IN (`2^>nul Dir "%BoxIn%\" /B /A:D /O:-D`) DO (
		FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\%%d\%Mask%" /B /A:-D /O:D`) DO (
			Call Ren "%BoxIn%\%%d\%%f" %%N%%%%~xf
			Set /A N+=1
		)
		Call :Pack "%BoxIn%\%%d\%Mask%" "%FileOut%" %%N%% %NContr% &&Exit /B
	)
	If "%N%"=="0" (Echo !!! In Subfolders of Folder "%BoxIn%\" files %Mask% not found. Script Exit. &Pause &Exit /B 2) 
Exit /B

:Pack
	If "%3"=="0" Exit /B 1
	%Arc% %2 %1 &&Rd /S /Q "%~dp1"

	If Not "%3"=="%4" Echo. &Echo Found In %1 files N=%3^<^>%4 files &Echo. &Pause
Exit /B 0
Если хочется, чтобы процесс исполнялся многократно быстрее, замените -mx5 на -mx0
Конечно, размер архивного файла будет больше, но, для jpg не намного (менее процента).

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 20-08-2019 в 14:27.

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:58, 20-08-2019 | #4


Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


megaloman, Огромное спасибо ! Завтра буду тестировать.

Отправлено: 16:06, 20-08-2019 | #5


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Добавлю сюда же код на PowerShell:
Скрытый текст
Код: Выделить весь код
$sRootFolder  = 'C:\Мои проекты\0273\Photo'
$sArchiveFile = "$sRootFolder\Photo.zip"

if([System.IO.Directory]::Exists($sRootFolder)) {
    $oDirectoryInfo = Get-ChildItem -Path $sRootFolder -Directory
    
    if($oDirectoryInfo -is [System.IO.DirectoryInfo]) {
        $aFileInfo = @(Get-ChildItem -Path "$($oDirectoryInfo.FullName)\*" -Include '*.jpg' -File)

        if($aFileInfo.Count -eq 32) {
            try {
                Compress-Archive -Path $aFileInfo -DestinationPath $sArchiveFile -CompressionLevel NoCompression -Force -ErrorAction SilentlyContinue
                Write-Host "Archive file [$sArchiveFile] created." -ForegroundColor Green
            } catch {
                Write-Host "Can't create archive file [$sArchiveFile]." -ForegroundColor Red
            }
        } else {
            Write-Host "Need exactly 32 jpg files in subfolder [$($oDirectoryInfo.FullName)]." -ForegroundColor Red
        }
    } else {
        Write-Host "Need at least one (and no more) subfolder in root folder [$sRootFolder]." -ForegroundColor Red
    }
} else {
    Write-Host "Can't find root folder [$sRootFolder]." -ForegroundColor Red
}

Последний раз редактировалось Iska, 21-08-2019 в 21:44. Причина: Не всё ТЗ реализовано :(.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:10, 20-08-2019 | #6


Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


Iska, Спасибо !

Отправлено: 08:42, 21-08-2019 | #7


Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


Еще раз всем спасибо! Работает так , как надо.

Отправлено: 10:24, 21-08-2019 | #8


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


К сожалению, на радостях я тупо забыл про:
Цитата nik123456654321:
переименовать эти .jpg фалы по очереди , начиная с 0 до 31 »
Исправленная версия:
Скрытый текст
Код: Выделить весь код
$sRootFolder  = 'C:\Мои проекты\0273\Photo'
$sArchiveFile = "$sRootFolder\Photo.zip"
$sExtension   = 'jpg'

if([System.IO.Directory]::Exists($sRootFolder)) {
    $oDirectoryInfo = Get-ChildItem -Path $sRootFolder -Directory
    
    if($oDirectoryInfo -is [System.IO.DirectoryInfo]) {
        $aFileInfo = @(Get-ChildItem -Path "$($oDirectoryInfo.FullName)\*" -Include "*.$sExtension" -File)

        if($aFileInfo.Count -eq 32) {
            $aFileInfo | ForEach-Object -Process {
                do {
                    $sNewFileName = "$($oDirectoryInfo.FullName)\$([System.IO.Path]::GetRandomFileName())$($_.Extension)"
                } until (-not [System.IO.File]::Exists($sNewFileName))

                [System.IO.File]::Move($_.FullName, $sNewFileName)
            }

            $aFileInfo = @(Get-ChildItem -Path "$($oDirectoryInfo.FullName)\*" -Include "*.$sExtension" -File) | Sort-Object -Property 'CreationTime'
            $aFileInfo | ForEach-Object -Begin {
                $iCount = 0
            } -Process {
                [System.IO.File]::Move($_.FullName, "$($oDirectoryInfo.FullName)\$(($iCount++).ToString())$($_.Extension)")
            }

            $aFileInfo = @(Get-ChildItem -Path "$($oDirectoryInfo.FullName)\*" -Include "*.$sExtension" -File)
            try {
                Compress-Archive -Path $aFileInfo -DestinationPath $sArchiveFile -CompressionLevel NoCompression -Force -ErrorAction SilentlyContinue
                Write-Host "Archive file [$sArchiveFile] created." -ForegroundColor Green
            } catch {
                Write-Host "Can't create archive file [$sArchiveFile]." -ForegroundColor Red
            }
        } else {
            Write-Host "Need exactly 32 $sExtension files in subfolder [$($oDirectoryInfo.FullName)]." -ForegroundColor Red
        }
    } else {
        Write-Host "Need at least one (and no more) subfolder in root folder [$sRootFolder]." -ForegroundColor Red
    }
} else {
    Write-Host "Can't find root folder [$sRootFolder]." -ForegroundColor Red
}

P.S. Надо же было столько возиться, чтобы сохранить оригинальные даты файлов, а потом открыть новосозданный архив в 7-Zip и внезапно обнаружить, что командлет Compress-Archive не сохраняет в архиве даты создания файлов .

Последний раз редактировалось Iska, 21-08-2019 в 22:03.

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:48, 21-08-2019 | #9


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата Iska:
не сохраняет в архиве даты создания файлов »
всё равно, при любом копировании, эти даты изменяются... да и если мне не изменяет мой склероз, они не сохраняются при извлечении из любого архива, то бишь это не Compress-Archive так работает, а файловая система...

-------
scio me nihil scire. Ѫ


Отправлено: 21:57, 21-08-2019 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Нужна помощь в написании скрипта работы с файлами.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Помощь в написании скрипта.. Boris81G Программирование в *nix 1 09-10-2015 12:46
PowerShell - Помощь в написании скрипта IVa_ Скриптовые языки администрирования Windows 3 10-07-2015 14:12
VBS/WSH/JS - Нужна помощь в написании скрипта автологина через веб-форму сайта Rampages Скриптовые языки администрирования Windows 4 08-03-2014 04:50
Нужна снова ваша помощь в написании интересного скрипта Magnus Вебмастеру 2 09-06-2005 20:26
Нужна помощь в написании скрипта Magnus Вебмастеру 7 06-05-2005 10:53




 
Переход