|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Удалить файлы по спискам, содержащимся в нескольких *.lst |
|
CMD/BAT - [решено] Удалить файлы по спискам, содержащимся в нескольких *.lst
|
Новый участник Сообщения: 34 |
В папке MainFldr (и во вложенных в нее подпапках) нужно удалить (лучше в корзину) файлы по спискам, содержащимся во всех *.lst из папки LstFldr.
Другими словами: В папке LstFldr есть несколько десятков *.lst , каждый из которых содержит список файлов, подлежащих удалению (ФПУ) из папки MainFldr (и из вложенных в нее подпапок). Других файлов в папке LstFldr нет. В *.lst имена ФПУ представлены без адресов; по одному на строку (пустых и посторонних строк нет), могут повторяться в различных *.lst. Все ФПУ только с цифрами и EN-буквами в именах, с расширениями. ФПУ (и/или содежащие их папки) могут быть с атрибутами +H, +S, +R. ФПУ могут повторяться в папке MainFldr (и во вложенных в нее подпапках). Хотелось бы также вывести в файл Deleted.lst список удаленных файлов (с их полными адресами до удаления), а в файл NonDeleted.lst вывести список ФПУ, которые так и не удалились (с их полными адресами). (OS: WinXP SP3) |
|
Отправлено: 02:07, 05-01-2019 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата dassen:
Цитата dassen:
Цитата dassen:
|
|||
Отправлено: 03:01, 05-01-2019 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 34
|
Профиль | Отправить PM | Цитировать смоделировал ситуацию как-то так
|
Отправлено: 04:24, 05-01-2019 | #3 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать На PowerShell это может выглядеть, например, так:
Скрытый текст
$sListFolder = 'C:\Мои проекты\0235\SomethingLikeThis\LstFldr' $sSourceFolder = 'C:\Мои проекты\0235\SomethingLikeThis\MainFldr' if([System.IO.Directory]::Exists($sListFolder)) { if([System.IO.Directory]::Exists($sSourceFolder)) { $hFiles = @{} Get-ChildItem -Path $sListFolder -Filter '*.lst' -File |` ForEach-Object -Process { Write-Host "Reading file name(s) from [$($_.FullName)]…" -ForegroundColor Cyan Get-Content -Path $_.FullName |` ForEach-Object -Process { if(-not $hFiles.ContainsKey($_)) { Write-Host "`tAdding unique file name [$_]" -ForegroundColor White $hFiles.Add($_, $_) } else { Write-Host "`tDuplicate file name [$_] found, skipping" -ForegroundColor Gray } } } Write-Host "Total found $($hFiles.Count) unique file name(s).`r`n" -ForegroundColor Cyan if($hFiles.Count -gt 0) { Write-Host "Deleting file(s)…" -ForegroundColor Cyan Set-Content -Path "Deleted.lst" -Encoding Default -Value '' -NoNewline Set-Content -Path "NonDeleted.lst" -Encoding Default -Value '' -NoNewline Get-ChildItem -Path $sSourceFolder -Include $($hFiles.Keys) -File -Recurse -Force |` ForEach-Object -Process { $sFullFileName = $_.FullName Write-Host "`t$sFullFileName" -ForegroundColor White try { $_.Attributes = [System.IO.FileAttributes]::Normal $_.Delete() Add-Content -Path "Deleted.lst" -Encoding Default -Value $sFullFileName } catch { Write-Host "`t`tAn error occured while deleting file [$sFullFileName]" -ForegroundColor Red Add-Content -Path "NonDeleted.lst" -Encoding Default -Value $sFullFileName } } } else { Write-Host "Nothing to delete." -ForegroundColor Cyan } } else { Write-Host "Can't find source folder [$sSourceFolder]." -ForegroundColor Red } } else { Write-Host "Can't find list's folder [$sListFolder]." -ForegroundColor Red } |
Отправлено: 07:50, 05-01-2019 | #4 |
Ветеран Сообщения: 3806
|
Профиль | Отправить PM | Цитировать Iska, передать весь список искомых файлов через Include в Get-ChildItem - интересная идея - я её не думал - возьму на заметку. Спасибо.
P.S. ну и традиционное про лютый трэш и угар: если вы раскрашиваете сообщения исходя из их разной ценности - используете стандартные Write-Debug, Write-Verbose, Write-Info - они и сами раскрасят, и ими можно извне хоть как-то управлять но вообще, это бесполезное самолюбование - как в кино: по экрану бежит куча текста который никто не читает и в принципе не в состоянии прочитать и проанализировать. Лучше бы уж тогда Write-Progress впилили заворачивать всё в глобальные if - ну так себе подход неудобно отслеживать к чему относится закрывающая скобка и else - разверните условие и сделайте выход сразу после if .Net библиотеки не знают ничего про PSdisk, поэтому ваши скритпы невозможно тестировать стандартным Pester метод файлового объекта Delete() вместо Remove-Item - тоже та ещё засада - я не могу в начале скрипта к примеру написать $PSDefaultParameterValues.Add("Remove-Item:WhatIf",$True) и посмотреть: что же происходит |
|
Отправлено: 14:50, 05-01-2019 | #5 |
Crazy Сообщения: 1218
|
Профиль | Отправить PM | Цитировать Цитата Iska:
|
|
------- Отправлено: 15:35, 05-01-2019 | #6 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать CMD тоже можно. Была проблема с атрибутами файлов.
@Echo Off cls Set "BoxData=Z:\Box_In\SomethingLikeThis\MainFldr" Set "FileList=Z:\Box_In\SomethingLikeThis\LstFldr\*.lst" Set /A N=10000 FOR %%f IN (%FileList%) DO FOR /F "usebackq delims=" %%s IN (`More "%%f"`) DO Call :Count "%%~nxs" If %N%==%Max% Echo !!! "%FileList%" not found &Exit /B 2 Call :MyDel "%BoxData%" FOR /F "usebackq delims=" %%d IN (`2^>nul Dir "%BoxData%" /B /S /A:D`) DO Call :MyDel "%%d" Pause GoTo :Eof :Count Set /A N+=1 Set "@@%N%=%~1" GoTo :Eof :MyDel FOR /F "usebackq tokens=1* delims==" %%f IN (`Set "@@"`) DO If Exist "%~1\%%~g" ( Attrib -R -H -S "%~1\%%~g" Del "%~1\%%~g" ) GoTo :Eof |
------- Отправлено: 15:43, 05-01-2019 | #7 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата YuS_2:
|
|
Отправлено: 15:50, 05-01-2019 | #8 |
Новый участник Сообщения: 34
|
Профиль | Отправить PM | Цитировать megaloman, большое спасибо. То, что надо. Основную задачу батник выполняет.
Цитата megaloman:
|
|
Отправлено: 19:55, 05-01-2019 | #9 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата Busla:
![]() Цитата Busla:
Цитата Busla:
Цитата Busla:
Зачем тогда пользовать консоль, если не пользовать все её возможности?! Цитата Busla:
Цитата Busla:
Цитата Busla:
![]() |
|||||||
Отправлено: 06:03, 09-01-2019 | #10 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] удалить файлы по маске *_i.ext | shadowbat | Скриптовые языки администрирования Windows | 16 | 05-01-2015 08:11 | |
Любой язык - Удалить файлы по размеру и дате создания (не изменения) | Vlad87 | Скриптовые языки администрирования Windows | 2 | 06-09-2014 15:23 | |
CMD/BAT - удалить файлы по маске из каталога | Gablik | Скриптовые языки администрирования Windows | 15 | 04-09-2012 16:23 | |
CMD/BAT - [решено] Удаление по спискам с масками | dorosa | Скриптовые языки администрирования Windows | 2 | 13-03-2012 02:30 | |
Удалить файлы в папке по маске | Nealles | Программирование и базы данных | 4 | 10-09-2003 23:11 |
|