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

Компьютерный форум 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

 

Ветеран


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

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


Цитата Busla:
зачем вы пишите такой лютый трэш и угар? »
Поясните, пожалуйста, подробнее.

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



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

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


Ветеран


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

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


есть родные для PoSh типы данных string и int
проверку директории через [System.IO.Directory]::Exists допустим, понять можно - штатные способы "проглотят", например, путь к реестру
хотя в целом - это простой конвейер, если что-то не так с директорией, содержимым - сам командлет выдаст ошибку снабжённую всеми необходимыми атрибутами, на языке пользователя . "Плюнуть" на экран красный текст на иностранном языке - это для кого такое "удобство"? Оформляете в виде вызываемого скрипта, но он не формирует события ошибки.
Для создания временных файлов есть стандартные механизмы и места, для удаления файлов - тоже. Зачем вместо штатных команд использовать обращения к библиотекам .NET?
Синтетическое поле для каждого файла с номером - зачем?! - Они уже в пронумерованном массиве
Вместо округления результата деления и отдельный итератор для групп используют целочисленное деления и остаток от целочисленного деления.
Не надо явно указывать `r`n - это платформозависимое соглашение, а что PoSh, что ffmpeg работаею и на mac и на linux. Не надо в памяти формировать файлы - пишите сразу строки в файл
Пути к ffmpeg самое место в параметре по умолчанию, а не в середине скрипта
А вот результат работы ffmpeg как раз должен проверяться - сейчас если он не сможет создать видео (места на диске не хватило), скрипт всё равно бодро рапортует об успехе и удаляет исходные изображения. Наличие выходного файла тоже
Вместо велосипеда с PromptForChoice можно просто вызвать Remove-Item с параметром -Confirm. Вы так уверены, что выдавать на экран простыню из 960 имён удалённых файлов - хорошая идея? Если они важны - не лучше ли тогда использовать Write-Output - чтобы можно было их по необходимости передать по конвейеру и т.п.?
switch с единственным параметром тоже умиляет

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


Ветеран


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

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


Busla, спасибо, ясно.

Цитата Busla:
есть родные для PoSh типы данных string и int »
Поясните подробнее, пожалуйста. Если Вы про [string] и [int] — в чём их «родность» для PowerShell и в чём отличие от [System.String] и [System.Int32]?

Цитата Busla:
проверку директории через [System.IO.Directory]::Exists допустим, понять можно - штатные способы "проглотят", например, путь к реестру »
Я полагаю сие более правильным подходом, нежели использование командлета Test-Path. Просто, надёжно и удобно.

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

Красная портянка бывает и больше.

Цитата Busla:
"Плюнуть" на экран красный текст на иностранном языке - это для кого такое "удобство"? »
Для себя. Это привычка.

Цитата Busla:
Оформляете в виде вызываемого скрипта, но он не формирует события ошибки. »
Здесь Вы совершенно правы. Надо учиться, как это делать, и как это делать правильно.

Цитата Busla:
Для создания временных файлов есть стандартные механизмы и места, »
Угу. Я использовал. Но у ffmpeg.exe есть свои принципы работы с путями, кодировками и конвеером . Потому потребовалось выбирать — либо шашечки, либо ехать.

Цитата Busla:
Зачем вместо штатных команд использовать обращения к библиотекам .NET? »
Как и в вышеупомянутом случае — потому что это проще, надёжнее и удобнее.

Цитата Busla:
Синтетическое поле для каждого файла с номером - зачем?! - Они уже в пронумерованном массиве »
Потому что у меня возникла проблема — как вменяемо получить индекс элемента из массива объектов, полученного по Get-ChildItem. Можете показать, как сие сделать?

Цитата Busla:
Вместо округления результата деления и отдельный итератор для групп используют целочисленное деления и остаток от целочисленного деления. »
Поясните, пожалуйста, подробнее.

Цитата Busla:
Не надо явно указывать `r`n - это платформозависимое соглашение, а что PoSh, что ffmpeg работаею и на mac и на linux. »
Я не планирую работу скрипта под иные платформы.

Цитата Busla:
Не надо в памяти формировать файлы - пишите сразу строки в файл »
Изначально я так и делал. Потом поменял логику работы. Что будет быстрее на большом количестве файлов — не проверял.

Цитата Busla:
Пути к ffmpeg самое место в параметре по умолчанию, а не в середине скрипта »
Соглашусь полностью.

Цитата Busla:
А вот результат работы ffmpeg как раз должен проверяться - сейчас если он не сможет создать видео (места на диске не хватило), скрипт всё равно бодро рапортует об успехе и удаляет исходные изображения. »
Соглашусь с оговоркой: всё равно надо смотреть полученный результат «глазками», и решение принимать по факту.

Цитата Busla:
Наличие выходного файла тоже »
Видимо, мысль не закончена.

Цитата Busla:
Вместо велосипеда с PromptForChoice можно просто вызвать Remove-Item с параметром -Confirm. »
Можно. Для отладки такие вещи:
Скрытый текст
годятся. Для работы — навряд ли: неподготовленного пользователя такие вопросы вводят в ступор.

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

Цитата Busla:
Если они важны - не лучше ли тогда использовать Write-Output - чтобы можно было их по необходимости передать по конвейеру и т.п.? »
Угу.

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

Отправлено: 21:17, 09-08-2018 | #13


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Iska:
как вменяемо получить индекс элемента из массива объектов, полученного по Get-ChildItem. »
Увы, вменяемо - вряд ли, нет встроенных инструментов. Но можно так:
Код: Выделить весь код
function findex ($arr, $val) {
    for ($i=0;$i -lt $arr.count;$i++) {
        if($arr[$i] -eq $val){$i}
    }
}
но лучше ведь так, имхо:
Код: Выделить весь код
[array]::indexof($arr.name,'name.ext')
хотя, сейчас дошли руки проверить и это:
Код: Выделить весь код
$arr.name.indexof('name.ext')
работает...

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


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


Отправлено: 13:42, 10-08-2018 | #14


Ветеран


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

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


YuS_2, боюсь, с группировкой отобранных файлов мне это не особо поможет.

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


Аватара для YuS_2

Crazy


Contributor


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

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


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

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


Последний раз редактировалось YuS_2, 10-08-2018 в 15:01.


Отправлено: 14:54, 10-08-2018 | #16


Ветеран


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

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


Цитата Iska:
как вменяемо получить индекс элемента из массива объектов, полученного по Get-ChildItem. Можете показать, как сие сделать? »
а зачем?! - индекс, чтобы по нему итерировать:
Код: Выделить весь код
$aFiles = Get-ChildItem *.jpg -File

$iListFileNumber = 0
$iLimit = 8
$i = 0

while ($i -lt $aFiles.Length)
{
  $sListName = "$($iListFileNumber.ToString('000000')).lst"
  $iFileNumber = 0
  while ($iFileNumber -lt $iLimit -and $i -lt $aFiles.Length)
  {
    
    $i = $iListFileNumber * $iLimit + $iFileNumber
    Add-Content -Path $sListName -Value $aFiles[$i].Name
    $iFileNumber+=1

  }
  $iListFileNumber+=1
}
польская нотация придумана, для имитации пользовательских типов - чтобы килограммы с километрами не складывать, а не для дублирования системных

Отправлено: 17:02, 10-08-2018 | #17


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Iska:
боюсь, с группировкой отобранных файлов мне это не особо поможет. »
Не понял зачем там do ... until с рандомом, да и разбираться не стал...
Но, как минимум, тут:
Код: Выделить весь код
    $aFiles = Get-ChildItem -Path "$sSourceFolder\*.*" -File -Include '*.jpg', '*.jpeg', '*.jpe'

    if($aFiles.Count -gt 0) {
        $i = 0
        foreach($oFile in $aFiles) {
            Add-Member -InputObject $oFile -NotePropertyName Number -NotePropertyValue $i
            $i++
        }

        $aFiles | Group-Object -Property { [Math]::Floor([System.Int32]$_.Number / $iLimit) }|...
действительно, есть лишнее действие (присвоение номеров элементам массива)...
Эквивалент:
Код: Выделить весь код
    $aFiles = Get-ChildItem -Path "$sSourceFolder\*.*" -File -Include '*.jpg', '*.jpeg', '*.jpe'
    $aFiles | Group-Object -Property { [Math]::Floor($aFiles.name.indexof($_.name) / $iLimit) }

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

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

Отправлено: 18:24, 10-08-2018 | #18


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


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

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


ух как тут жарко
спасибо большое за ответы. power shell конечно монструозный
что в .bat 10 строк, то в powershell целый том войны и мира

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

Отправлено: 18:38, 10-08-2018 | #19


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата bidjo:
что в .bat 10 строк, то в powershell целый том войны и мира »
Это только так кажется... а на самом деле, powershell имеет значительно бОльшие возможности и инструменты, чем cmd, да и побыстрее работает, однако...
Например, прибавьте или отнимите, скажем, 7 дней к текущей дате в cmd, с учетом разного количества дней в месяцах, а также переход в новый/предыдущий месяц/год...
Вот, как это делается на powershell:
Код: Выделить весь код
(get-date).adddays(7)
(get-date).adddays(-7)

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


Отправлено: 19:15, 10-08-2018 | #20



Компьютерный форум 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




 
Переход