CMD/BAT - удаление файлов по списку list.txt

Аватара пользователя
bidjo

Re: CMD/BAT - удаление файлов по списку list.txt

Сообщение bidjo »

ух как тут жаркоИзображение

спасибо большое за ответы. power shell конечно монструозный

что в .bat 10 строк, то в powershell целый том войны и мира



один вопрос

после формирования файла в list.txt есть куча строк с указанием файлов, из которых формируется видео.

выходное имя видео это то, что я задам, можно даже указать время сегодняшнее.

а нельзя ли, в качестве имени файла указать первую строчку и последнюю строчку list.txt?

допустим в папке лежат фото собачей будкии, а на выходе получилось не N.avi, а Будка злой собаки 01-01-2018_00h01m01s Будка злой собаки 01-01-2018_23h59m01s.avi
Аватара пользователя
YuS_2

Re: CMD/BAT - удаление файлов по списку list.txt

Сообщение YuS_2 »

Цитата Busla:



а зачем?!
CMD/BAT - удаление файлов по списку list.txt




Мне — для группировки файлов «пачками».



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




Цитата Busla:



польская нотация придумана, для имитации пользовательских типов - чтобы килограммы с километрами не складывать, а не для дублирования системных
CMD/BAT - удаление файлов по списку list.txt




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




Цитата YuS_2:



Не понял зачем там do ... until с рандомом, да и разбираться не стал...
CMD/BAT - удаление файлов по списку list.txt




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




Цитата YuS_2:



Эквивалент:
CMD/BAT - удаление файлов по списку list.txt




Спасибо, ясно. Будем знать.




Цитата Busla:



YuS_2, поиск индекса по значению в общем случае плохая затея: неэффективная и нужно быть уверенным в уникальности значений
CMD/BAT - удаление файлов по списку list.txt




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




Цитата Busla:



да и вообще ненужная: кто сказал, что группировать можно только по свойствам объекта?
CMD/BAT - удаление файлов по списку list.txt




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




Цитата Busla:



единственное - потребовался небольшой хак, чтобы итератор стал ссылочным типом
CMD/BAT - удаление файлов по списку list.txt




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




Цитата Busla:



Iska, Double - это двоичная дробь и двоичный сдвиг, поэтому отбрасывание дробной части может дать неожиданный результат.
CMD/BAT - удаление файлов по списку list.txt




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

Re: CMD/BAT - удаление файлов по списку list.txt

Сообщение Iska »

эмм простите , а итоговый то скрипт какой?Изображение
Аватара пользователя
bidjo

Re: CMD/BAT - удаление файлов по списку list.txt

Сообщение bidjo »

Цитата bidjo:



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




А итоговый — пишется по новым данным Изображение. Потом туда добавится и это:


Цитата bidjo:



выходное имя видео это то, что я задам, можно даже указать время сегодняшнее.

а нельзя ли, в качестве имени файла указать первую строчку и последнюю строчку list.txt?

допустим в папке лежат фото собачей будкии, а на выходе получилось не N.avi, а Будка злой собаки 01-01-2018_00h01m01s Будка злой собаки 01-01-2018_23h59m01s.avi
CMD/BAT - удаление файлов по списку list.txt
Аватара пользователя
bidjo

Re: CMD/BAT - удаление файлов по списку list.txt

Сообщение bidjo »

Ну, вот, как-то так:



Скрытый текст

[spoiler]Код:
[/spoiler]

Код: Выделить всё

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, находящегося в текущем каталоге, с группировкой файлов по двадцать штук:



Скрытый текст

[spoiler]Изображение[/spoiler]






Возможный результат

[spoiler]Изображение[/spoiler]
Аватара пользователя
Iska

Re: CMD/BAT - удаление файлов по списку list.txt

Сообщение Iska »

Цитата Busla:



неэффективная и нужно быть уверенным в уникальности значений
CMD/BAT - удаление файлов по списку list.txt




это да... но если очень хочется, почему бы и нет? В смысле, что вариант использования, вполне присутствует. Изображение

А на счет уникальности - в данном, конкретном случае, всё на месте, в смысле уверенность в этом есть.




Цитата Busla:



кто сказал, что группировать можно только по свойствам объекта?
CMD/BAT - удаление файлов по списку list.txt




Вот! А это, как раз, пример творческого подхода. Вполне себе, ещё вариант и более быстродействующий...




Цитата Iska:



Дабы получить имя временного файла, которого гарантированно не существует в указанном каталоге. Чтобы быть абсолютно точно уверенным в данном факте.
CMD/BAT - удаление файлов по списку list.txt




Угу, сама идея-то понятна, непонятно с какой целью используется... ну, да это вообще не важно...




Цитата Iska:



не вижу принципиальной разницы что использовать
CMD/BAT - удаление файлов по списку list.txt




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




Цитата Iska:



потому что не обнаружил в PowerShell оператора целочисленного деления, а DivRem() — тупо не нашёл
CMD/BAT - удаление файлов по списку list.txt




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



Код:

Код: Выделить всё

man about_Arithmetic_Operators -full

- там, конечно, всего не найти, но очень многое, можно в памяти и не держать:

[int](5/2)



и так тоже можно:



Код:

Код: Выделить всё

[math]|gm -stat

имхо, это ведь очень удобно...
Аватара пользователя
YuS_2

Re: CMD/BAT - удаление файлов по списку list.txt

Сообщение YuS_2 »

Цитата YuS_2:



Угу, сама идея-то понятна, непонятно с какой целью используется... ну, да это вообще не важно...
CMD/BAT - удаление файлов по списку list.txt




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




Цитата YuS_2:



А мне вот powershell чем понравился... у него, всегда можно, не рыская по справочникам, дернуть встроенную справку...
CMD/BAT - удаление файлов по списку list.txt




А мне именно тем же — не понравился абсолютно: убого, неточно и недостаточно.
Аватара пользователя
Iska

Re: CMD/BAT - удаление файлов по списку list.txt

Сообщение Iska »

Цитата YuS_2:



там, конечно, всего не найти, но очень многое, можно в памяти и не держать:

[int](5/2)
CMD/BAT - удаление файлов по списку list.txt




вот и попробуйте сделать:



Код:

Код: Выделить всё

[int](7/2)

к сожалению, совершенно неочевидна принадлежность к библиотеке Math


Цитата YuS_2:



[math]|gm -stat
CMD/BAT - удаление файлов по списку list.txt




Это чисто декоративная обёртка надо базовыми операциями




Цитата Iska:



не вижу принципиальной разницы что использовать — псевдоним или полное определение типа, [int] или [System.Int32], [string] или [System.String]
CMD/BAT - удаление файлов по списку list.txt




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

а тот, кто совсем не знаком с .NET не всегда поймёт что написано




Цитата Iska:



хотелось бы использовать конвеер и группировку
CMD/BAT - удаление файлов по списку list.txt




IMHO прелесть конвейера в потоковой схеме обработки данных: он начинает работать получив первую порцию данных и работает со скоростью самого медленного этапа обработки

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



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

(штатная) группировка ставит крест на этой светлой идее: она не знает, что группировка у нас по монотонному итератору, поэтому для анализа грузит в память весь список файлов



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

Re: CMD/BAT - удаление файлов по списку list.txt

Сообщение Busla »

Цитата Busla:



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




а что не так? Нормальное округление Изображение

Причем,
округление банкиров
.

Так сказать:

[int]3.5 -eq [int]4.5




Цитата Busla:



к сожалению, совершенно неочевидна принадлежность к библиотеке Math
CMD/BAT - удаление файлов по списку list.txt




Отчего же? [int] - алиас [System.Int32]

Или Вы о чем?




Цитата Busla:



Это чисто декоративная обёртка надо базовыми операциями
CMD/BAT - удаление файлов по списку list.txt




Так ведь, что такое powershell, по сути? Изображение
Аватара пользователя
YuS_2

Re: CMD/BAT - удаление файлов по списку list.txt

Сообщение YuS_2 »

Цитата YuS_2:



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




1) в других языках приведение float к int работает как floor

2) в данном контексте нарезка будет не на равные части, а ±1




Цитата YuS_2:



Или Вы о чем?
CMD/BAT - удаление файлов по списку list.txt




о том, что странно искать целочисленное деление в библиотеке Math
Ответить

Вернуться в «Скриптовые языки администрирования Windows»