|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - удаление файлов по списку list.txt |
|
CMD/BAT - удаление файлов по списку list.txt
|
Новый участник Сообщения: 14 |
всем привет.
есть скрипт, в конце скрипта прописано удаление файлов которые указаны в списке list.txt скрипт пашет, но выдает кучу ошибок в конце в данный момент он выглядит так @echo off setlocal 1>nul chcp 1251 cd C:\vs (for %%i in (*.jpg) do @echo file '%%i') > list.txt ffmpeg -f concat -safe 0 -r 2 -i list.txt -threads 2 -vcodec libx264 -preset veryfast -qp 30 -tune grain -r 1 -framerate 1 30.avi call For /F "delims=" %%A In ('Dir "*.*" /A-D /B') Do (Echo %%~A)>>list.txt For /f "tokens=*" %%i in (list.txt) do attrib -a %%i attrib -a %0 del /aa /q /f *.* del list.txt pause и ошибок этих столько, сколько файлов я обрабатываю. а их несколько тысяч. в итоге скрипт отрабатывает за 1 минуту грубо говоря и 5 минут срет в лог ошибку формата параметра. чоделатьпомогите |
|
Отправлено: 20:30, 07-08-2018 |
Ветеран Сообщения: 3806
|
Профиль | Отправить PM | Цитировать YuS_2, поиск индекса по значению в общем случае плохая затея: неэффективная и нужно быть уверенным в уникальности значений
да и вообще ненужная: кто сказал, что группировать можно только по свойствам объекта? $oCount = @{ iValue = 0 } $iLimit = 8 Get-ChildItem *.jpg | Group-Object { [Math]::DivRem($oCount.iValue++ , $iLimit, [ref]$null) } Iska, Double - это двоичная дробь и двоичный сдвиг, поэтому отбрасывание дробной части может дать неожиданный результат. |
Отправлено: 12:16, 11-08-2018 | #21 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата Busla:
По коду: с этим-то понятно. Минус такого подхода — в двойной проверке: общий цикл «для всего» и вложенная в него аналогичная проверка для того же условия, либо вложенным циклом, как у Вас (и так — да, красивее), либо простым условием с прерыванием цикла, как обычно делаю я. То бишь, делать — можно, но громоздко. Ладно, когда другого выхода нет (например, в том же WSH), а тут хотелось бы использовать конвеер и группировку. Цитата Busla:
Цитата YuS_2:
Цитата YuS_2:
Цитата Busla:
Цитата Busla:
Цитата Busla:
![]() Цитата Busla:
![]() |
||||||||
Отправлено: 22:21, 11-08-2018 | #22 |
Новый участник Сообщения: 14
|
Профиль | Отправить PM | Цитировать эмм простите , а итоговый то скрипт какой?
![]() |
Отправлено: 23:38, 11-08-2018 | #23 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата bidjo:
![]() Цитата bidjo:
|
||
Отправлено: 23:41, 11-08-2018 | #24 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Ну, вот, как-то так:
Скрытый текст
Param ( [System.String]$Path2FFMpeg = "$($ENV:ProgramFiles)\FFmpeg\bin\ffmpeg.exe", [System.String]$SourceFolder = '.', [System.Int32]$GroupBy = 960 ) $SourceFolder = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($SourceFolder) if([System.IO.Directory]::Exists($SourceFolder)) { if([System.IO.File]::Exists($Path2FFMpeg)) { do { $sFileList = [System.IO.Path]::Combine($SourceFolder, [System.IO.Path]::GetRandomFileName()) } until(-not [System.IO.File]::Exists($sFileList)) $hTable = @{ iCount = 0 } $aFiles = Get-ChildItem -Path "$SourceFolder\*.*" -File -Include '*.jpg', '*.jpeg', '*.jpe' if($aFiles.Count -gt 0) { $bSuccess = $true $aFiles | Group-Object { [Math]::DivRem($hTable.iValue++ , $GroupBy, [ref]$null) } | ForEach-Object -Process { $_.Group | ForEach-Object -Begin { $sContent = '' } -Process { $sContent += "file '$($_.Name)'`r`n" } -End { $sOutputFileName = ($_.Group[0]).BaseName + ' - ' + ($_.Group[$_.Group.Count - 1]).BaseName + ".avi" Out-File -InputObject $sContent -FilePath $sFileList -Encoding "Default" -NoNewline $oCurrentCodePageEncoding = [Console]::OutputEncoding [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 $oProcess = Start-Process ` -FilePath $Path2FFMpeg ` -ArgumentList "-y -f concat -safe 0 -r 2 -i `"$([System.IO.Path]::GetFileName($sFileList))`" -threads 2 -vcodec libx264 -preset veryfast -qp 30 -tune grain -r 1 -framerate 1 `"$sOutputFileName`"" ` -WorkingDirectory $SourceFolder ` -NoNewWindow -Wait -PassThru [Console]::OutputEncoding = $oCurrentCodePageEncoding if($oProcess.ExitCode -eq 0) { Write-Host "`r`n$($_.Count) file(s) splitted into [$sOutputFileName].`r`n" -ForegroundColor Green } else { $bSuccess = $false Write-Host "`r`nProbably an error [$($oProcess.ExitCode)] occured while try split files into [$sOutputFileName].`r`n" -ForegroundColor Red } } } [System.IO.File]::Delete($sFileList) if($bSuccess) { switch($host.UI.PromptForChoice("Delete files?", "Delete all splitted jpeg files?", [System.Management.Automation.Host.ChoiceDescription[]] @("&Yes", "&No"), 1)) { 0 { foreach($oFile in $aFiles) { $oFile.Delete() Write-Host "File [$($oFile.Name)] deleted." -ForegroundColor Green } Write-Host "`r`nTotal $($aFiles.Count) file(s) deleted." -ForegroundColor Green } 1 { # Nothing to do } } } } else { Write-Host "Can't find any jpeg files in source folder [$SourceFolder], nothing to do." -ForegroundColor Green } } else { Write-Host "Can't find ffmpeg in [$Path2FFMpeg]." -ForegroundColor Red } } else { Write-Host "Can't find source folder [$SourceFolder]." -ForegroundColor Red } Теперь первый параметр, Path2FFMpeg — путь к ffmpeg.exe (по умолчанию — C:\Program Files\FFmpeg\bin\ffmpeg.exe), второй параметр, SourceFolder — путь к целевому каталогу (по умолчанию — текущий каталог), третий параметр, GroupBy — число файлов в «пачке», из которой формируется видеофайл (по умолчанию — 960). Имена выходных видеофайлов формируются по указанному Вами принципу, нумерацию я оттуда вообще убрал. Например, вызываем скрипт для обработки каталога 0008, находящегося в текущем каталоге, с группировкой файлов по двадцать штук: Скрытый текст
![]() Возможный результат
![]() |
Отправлено: 02:35, 12-08-2018 | #25 |
Crazy Сообщения: 1218
|
Профиль | Отправить PM | Цитировать Цитата Busla:
![]() А на счет уникальности - в данном, конкретном случае, всё на месте, в смысле уверенность в этом есть. Цитата Busla:
Цитата Iska:
Цитата Iska:
Цитата Iska:
- там, конечно, всего не найти, но очень многое, можно в памяти и не держать: [int](5/2) и так тоже можно: имхо, это ведь очень удобно... |
|||||
------- Отправлено: 09:22, 12-08-2018 | #26 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата YuS_2:
Цитата YuS_2:
|
||
Отправлено: 12:12, 12-08-2018 | #27 |
Ветеран Сообщения: 3806
|
Профиль | Отправить PM | Цитировать Цитата YuS_2:
к сожалению, совершенно неочевидна принадлежность к библиотеке Math Цитата YuS_2:
Цитата Iska:
а тот, кто совсем не знаком с .NET не всегда поймёт что написано Цитата Iska:
он вообще может работать с данными, которых ещё нет в природе - подать на вход конвейера вывод датчика температуры и он потом годами будет переводить фаренгейты в градусы, сохранять в csv и слать алармы при критичных значениях применительно к данному случаю - запустить скрипт, увидеть, что работает он уже третий день и досыпать туда ещё вчерашних фоток для склейки (штатная) группировка ставит крест на этой светлой идее: она не знает, что группировка у нас по монотонному итератору, поэтому для анализа грузит в память весь список файлов Iska, поделитесь, пожалуйста: как вы сделали длинный скриншот консоли? |
||||
Последний раз редактировалось Busla, 12-08-2018 в 14:51. Отправлено: 14:25, 12-08-2018 | #28 |
Crazy Сообщения: 1218
|
Профиль | Отправить PM | Цитировать Цитата Busla:
![]() Причем, округление банкиров. Так сказать: [int]3.5 -eq [int]4.5 Цитата Busla:
Или Вы о чем? Цитата Busla:
![]() |
|||
------- Отправлено: 15:23, 12-08-2018 | #29 |
Ветеран Сообщения: 3806
|
Профиль | Отправить PM | Цитировать |
Отправлено: 15:47, 12-08-2018 | #30 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Выборка и txt по списку в txt файле | cyberp1983 | Скриптовые языки администрирования Windows | 5 | 24-05-2018 20:27 | |
CMD/BAT - Общий размер каталогов по списку в TXT | surgutfred | Скриптовые языки администрирования Windows | 8 | 11-12-2017 08:31 | |
CMD/BAT - Удаление файлов по списку | Freddy1984 | Скриптовые языки администрирования Windows | 11 | 04-05-2017 08:36 | |
CMD/BAT - [решено] Поиск файлов в поддиректориях по списку из txt и перемещение | Sub-Zero | Скриптовые языки администрирования Windows | 15 | 27-03-2017 12:58 | |
CMD/BAT - Удаление файлов и папок по списку с выводом результата в файл | Sub-Zero | Скриптовые языки администрирования Windows | 0 | 08-12-2015 23:12 |
|