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

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

Ответить
Настройки темы
CMD/BAT - удаление файлов по списку list.txt

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


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

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


всем привет.
есть скрипт, в конце скрипта прописано удаление файлов которые указаны в списке 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
после отрабатывания скрипта, он все за собой чистит но в cmd ошибки
Код: Выделить весь код
ошибка в формате параметра
и ошибок этих столько, сколько файлов я обрабатываю. а их несколько тысяч. в итоге скрипт отрабатывает за 1 минуту грубо говоря и 5 минут срет в лог ошибку формата параметра.
чоделатьпомогите

Отправлено: 20:30, 07-08-2018

 

Ветеран


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

Профиль | Отправить 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
Благодарности: 8086

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


Цитата Busla:
а зачем?! »
Мне — для группировки файлов «пачками».

По коду: с этим-то понятно. Минус такого подхода — в двойной проверке: общий цикл «для всего» и вложенная в него аналогичная проверка для того же условия, либо вложенным циклом, как у Вас (и так — да, красивее), либо простым условием с прерыванием цикла, как обычно делаю я. То бишь, делать — можно, но громоздко. Ладно, когда другого выхода нет (например, в том же WSH), а тут хотелось бы использовать конвеер и группировку.

Цитата Busla:
польская нотация придумана, для имитации пользовательских типов - чтобы килограммы с километрами не складывать, а не для дублирования системных »
Не-не-не, это операция приведения типа, и я повторюсь, что не вижу принципиальной разницы что использовать — псевдоним или полное определение типа, [int] или [System.Int32], [string] или [System.String].

Цитата YuS_2:
Не понял зачем там do ... until с рандомом, да и разбираться не стал...»
Дабы получить имя временного файла, которого гарантированно не существует в указанном каталоге. Чтобы быть абсолютно точно уверенным в данном факте.


Цитата YuS_2:
Эквивалент: »
Спасибо, ясно. Будем знать.

Цитата Busla:
YuS_2, поиск индекса по значению в общем случае плохая затея: неэффективная и нужно быть уверенным в уникальности значений »
Ну, значения-то у нас будут уникальные (в данном случае), а вот что поиск индекса по значению в массиве есть операция крайне медлительная — это факт.


Цитата Busla:
да и вообще ненужная: кто сказал, что группировать можно только по свойствам объекта? »
Busla, браво! Мысленно снимаю шляпу. Казалось бы, элементарная вещь — но ведь до этого нужно ещё дойти, сообразить, что так — передавать по конвееру одно, а группировать по другой сущности, совсем не связанной с переданным по конвееру — тоже можно.

Цитата Busla:
единственное - потребовался небольшой хак, чтобы итератор стал ссылочным типом »
Вот-вот. А я на этом упёрся и фсё, не сообразил, как сделать так, чтобы и овцы были целы, и волки сыты . Это вовсе не хак, это вполне нормальный способ обойти ограничения передачи аргумента по значению.

Цитата Busla:
Iska, Double - это двоичная дробь и двоичный сдвиг, поэтому отбрасывание дробной части может дать неожиданный результат. »
Ну, тут по-хорошему надо смотреть, как хранятся числа в памяти — с фиксированной точкой или плавающей, как именно организовано вычисление операции деления. Совсем не копался на эту тему. Почему использовал Floor() — потому что не обнаружил в PowerShell оператора целочисленного деления, а DivRem() — тупо не нашёл .

Отправлено: 22:21, 11-08-2018 | #22


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


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

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


эмм простите , а итоговый то скрипт какой?

Отправлено: 23:38, 11-08-2018 | #23


Ветеран


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

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


Цитата bidjo:
а итоговый то скрипт какой? »
А итоговый — пишется по новым данным . Потом туда добавится и это:
Цитата bidjo:
выходное имя видео это то, что я задам, можно даже указать время сегодняшнее.
а нельзя ли, в качестве имени файла указать первую строчку и последнюю строчку list.txt?
допустим в папке лежат фото собачей будкии, а на выходе получилось не N.avi, а Будка злой собаки 01-01-2018_00h01m01s Будка злой собаки 01-01-2018_23h59m01s.avi »

Отправлено: 23:41, 11-08-2018 | #24


Ветеран


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

Профиль | Отправить 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


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Busla:
неэффективная и нужно быть уверенным в уникальности значений»
это да... но если очень хочется, почему бы и нет? В смысле, что вариант использования, вполне присутствует.
А на счет уникальности - в данном, конкретном случае, всё на месте, в смысле уверенность в этом есть.

Цитата Busla:
кто сказал, что группировать можно только по свойствам объекта? »
Вот! А это, как раз, пример творческого подхода. Вполне себе, ещё вариант и более быстродействующий...

Цитата Iska:
Дабы получить имя временного файла, которого гарантированно не существует в указанном каталоге. Чтобы быть абсолютно точно уверенным в данном факте. »
Угу, сама идея-то понятна, непонятно с какой целью используется... ну, да это вообще не важно...

Цитата Iska:
не вижу принципиальной разницы что использовать »
Это точно. Просто алиасы, как правило, короче в записи и поэтому удобнее использовать их, а разницы нет абсолютно.

Цитата Iska:
потому что не обнаружил в PowerShell оператора целочисленного деления, а DivRem() — тупо не нашёл »
А мне вот powershell чем понравился... у него, всегда можно, не рыская по справочникам, дернуть встроенную справку...
Код: Выделить весь код
man about_Arithmetic_Operators -full
- там, конечно, всего не найти, но очень многое, можно в памяти и не держать:
[int](5/2)

и так тоже можно:
Код: Выделить весь код
[math]|gm -stat
имхо, это ведь очень удобно...

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


Отправлено: 09:22, 12-08-2018 | #26


Ветеран


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

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


Цитата YuS_2:
Угу, сама идея-то понятна, непонятно с какой целью используется... ну, да это вообще не важно... »
Ну, как «зачем» — чтобы гарантировать, что данное полученное имя временного файла не совпадает с уже существующим. Да, вероятность совпадения имён теоретически околонулевая, но всё ж не нулевая.

Цитата YuS_2:
А мне вот powershell чем понравился... у него, всегда можно, не рыская по справочникам, дернуть встроенную справку... »
А мне именно тем же — не понравился абсолютно: убого, неточно и недостаточно.

Отправлено: 12:12, 12-08-2018 | #27


Ветеран


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

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


Цитата YuS_2:
там, конечно, всего не найти, но очень многое, можно в памяти и не держать:
[int](5/2) »
вот и попробуйте сделать:
Код: Выделить весь код
[int](7/2)
к сожалению, совершенно неочевидна принадлежность к библиотеке Math
Цитата YuS_2:
[math]|gm -stat »
Это чисто декоративная обёртка надо базовыми операциями

Цитата Iska:
не вижу принципиальной разницы что использовать — псевдоним или полное определение типа, [int] или [System.Int32], [string] или [System.String] »
тот, кто понимает, пытается в каждом обращении к "низкоуровневым" библиотекам бэкэнда усмотреть подвох: почему именно Int32? - что завязано на конкретную разрядность? Или при вызове функций - что не так в реализации стандартного решения?
а тот, кто совсем не знаком с .NET не всегда поймёт что написано

Цитата Iska:
хотелось бы использовать конвеер и группировку »
IMHO прелесть конвейера в потоковой схеме обработки данных: он начинает работать получив первую порцию данных и работает со скоростью самого медленного этапа обработки
он вообще может работать с данными, которых ещё нет в природе - подать на вход конвейера вывод датчика температуры и он потом годами будет переводить фаренгейты в градусы, сохранять в csv и слать алармы при критичных значениях

применительно к данному случаю - запустить скрипт, увидеть, что работает он уже третий день и досыпать туда ещё вчерашних фоток для склейки
(штатная) группировка ставит крест на этой светлой идее: она не знает, что группировка у нас по монотонному итератору, поэтому для анализа грузит в память весь список файлов

Iska, поделитесь, пожалуйста: как вы сделали длинный скриншот консоли?

Последний раз редактировалось Busla, 12-08-2018 в 14:51.


Отправлено: 14:25, 12-08-2018 | #28


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Busla:
вот и попробуйте сделать »
а что не так? Нормальное округление
Причем, округление банкиров.
Так сказать:
[int]3.5 -eq [int]4.5

Цитата Busla:
к сожалению, совершенно неочевидна принадлежность к библиотеке Math »
Отчего же? [int] - алиас [System.Int32]
Или Вы о чем?

Цитата Busla:
Это чисто декоративная обёртка надо базовыми операциями »
Так ведь, что такое powershell, по сути?

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


Отправлено: 15:23, 12-08-2018 | #29


Ветеран


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

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


Цитата YuS_2:
а что не так? Нормальное округление »
1) в других языках приведение float к int работает как floor
2) в данном контексте нарезка будет не на равные части, а ±1

Цитата YuS_2:
Или Вы о чем? »
о том, что странно искать целочисленное деление в библиотеке Math

Отправлено: 15:47, 12-08-2018 | #30



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход