![]() |
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] не работает скрипт счет кол-ва и размера файлов |
|
|
PowerShell - [решено] не работает скрипт счет кол-ва и размера файлов
|
Новый участник Сообщения: 31 |
Господа и господамы, здравствуйте! Беда-печаль - руководство просит проанализировать рост объема данных на файлохранилищах для предсказания роста оных. Ради сей задачи был накидан скриптик, с которым можно ознакомиться ниже, и который, собака такая страшная, отказывается работать. Чую косяк с переносами строк и определением типов. Пример входного файла в конце.
Жду помощи от более опытных коллег. #Задаем путь к CSV файлу со списком папок для поиска и путь к папке с результатами работы скрипта $PathToCsv = "C:\Temp\Test.csv" $PathToResult = "C:\Temp\" #задаем "глубину" поиска $DaysToSearch = 749 #задаем временной промежуток для поиска (в днях) $DaysIntervalToSearch = 7 #Импортируем CSV файл $Path_Folders = Import-Csv -Path $PathToCsv -Delimiter ";" foreach ($Path_Folder in $Path_Folders) { #Выбираем следующую строку $Path = $Path_Folder.PathFolder $ResultFileName = $Path_Folder.ResFileName #Просто текст, для вывода. культуры ради. $Txt = "Analising $Path" #заранее объявляем переменную с полным путем выходного файла $ResultFilePath = $PathToResult + $ResultFileName + ".csv" #пишем какую папку анализируем Write-Host $Txt -ForegroundColor Green #Готовимся к циклу. $FinDay=$DaysToSearch $DayInterval=$DaysIntervalToSearch #Считаем кол-во столбов в результируещем файле $b = $FinDay / $DayInterval #Задаем размер массива для хранения названий столбцов $StringsArray = 1..($b*2) #Обнуляем переменную для счетчика элементов массива =) $x = 0 #переменная для хранения результата нашего поиска $files=dir $Path -recurse | Select Fullname,CreationTime,LastWriteTime,Length, @{Name="Age";Expression={(Get-Date)-$_.CreationTime}}, @{Name="Days";Expression={[int]((Get-Date)-$_.CreationTime).TotalDays}} #хэш с результатами поиска $hash=@{ #Объявляем и заполняем наши столбцы с результатами работы Path=$path #Подсчет кол-ва и объема файлов, старее заданной глубины поиска Over = ($files | Where {$_.Days -gt $FinDay} | Measure-Object).Count 'Over_SizeKB'= [math]::Round((($files | Where {$_.Days -gt $FinDay} | Measure-Object -Property Length -Sum).sum/1KB),2) Do { #Создаем текстовые строки для последующего вывода в файл $FDayInterval = $FinDay - $DayInterval $StringDays = [string]$FinDay + 'Days' $StringDaysSize = [string]$FinDay + 'Days_SizeKB' #Заполняем массив получившимися строками для финального select-а $StringsArray[$x] = $StringDays $StringsArray[$x+1] = $StringDaysSize $x = $x+2 #Подсчитываем кол-во элементов и их размер в KB в папке за заданный временной промежуток '$StringDays'= ($files | Where {$_.Days -gt $FDayInterval -AND $_.Days -le $FinDay} | Measure-Object).Count '$StringDaysSize'= [math]::Round((($files | Where {$_.Days -gt $FDayInterval -AND $_.Days -le $FinDay} | Measure-Object -Property Length -Sum).sum/1KB),2) #Уменьшаем глубину поиска $FinDay = $FinDay - $DayInterval } Until ($FinDay -le 1) } New-Object -TypeName PSObject -Property $hash | Select Path,Over, Over_SizeKB, $StringsArray | export-CSV $ResultFilePath -Encoding UTF8 -Delimiter ";" } Пример входных данных (Разумеется внутри CSV файлика): |
|
Отправлено: 21:45, 16-06-2016 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Wheee111, Вы словами напишите, что Вы хотите получить.
|
Отправлено: 01:58, 17-06-2016 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 31
|
Профиль | Отправить PM | Цитировать Iska, Благодарю за ответ.
Задача состоит в том, что бы проанализировать за 2 года рост объема файлов на файловых серверах. с детализацией до папки департамента. т.е. структура папок выглядит примерно так: \\SrvFile(01-10)\Company(01-06)\Department(01-20)\* Мой вариант реализации, по идее должен проходить по всем папкам, указанным в заранее подготовленном файле, считать информацию о дате создания файлов в указанных папках и кол-во файлов, после записать полученный результат в разные файлы. для каждого департамента свой файл (м.б. можно и в один). Соответственно идет анализ изменений за 7 дней. На выходе получаем табличку вида: имя папки | кол-во и размер старше 2х лет | кол-во и размер файлов созданных в промежутке 749-742 дня назад | кол-во и размер файлов созданных в промежутке 742-735 дней назад | etc... | кол-во и размер файлов созданных в промежутке 7-0 дней назад ------ Select Fullname, LastWriteTime - задел на будущее для фильтрации ошибок доступа или слишком длинного пути и анализа не по дате создания, а дате изменения. |
Последний раз редактировалось Wheee111, 17-06-2016 в 02:48. Причина: Added PS Отправлено: 02:42, 17-06-2016 | #3 |
Ветеран Сообщения: 1759
|
Как пример:
$files = get-childitem "C:\Folder" -recurse -file -force -ea 0 foreach ($file in $files) { switch (((get-date) - (get-date $file.lastwritetime)).days) { { $_ -ge 1000 } { $age1000++; $size1000 += $file.length } { $_ -ge 750 -and $_ -le 999 } { $age_750++; $size_750 += $file.length } { $_ -ge 500 -and $_ -le 749 } { $age_500++; $size_500 += $file.length } { $_ -ge 250 -and $_ -le 499 } { $age_250++; $size_250 += $file.length } default { $age_000++; $size_000 += $file.length } } } $result = [pscustomobject] @{ '1000+' = ("$age1000/" + ($size1000 / 1mb).tostring('f')) '750+' = ("$age_750/" + ($size_750 / 1mb).tostring('f')) '500+' = ("$age_500/" + ($size_500 / 1mb).tostring('f')) '250+' = ("$age_250/" + ($size_250 / 1mb).tostring('f')) '0+' = ("$age_000/" + ($size_000 / 1mb).tostring('f')) } $result | format-table -auto |
Последний раз редактировалось Foreigner, 21-06-2016 в 18:35. Отправлено: 09:36, 17-06-2016 | #4 |
Новый участник Сообщения: 31
|
Профиль | Отправить PM | Цитировать Foreigner, Идея интересна, но мне на выходе нужно получить большое кол-во точек за неопределенный заранее промежуток времени, для детального изучения графика роста объема данных и предсказания планируемого объема при таких же темпах роста, через год, два или три. Если выборка маленькая, то грфик будет "скакать" в зависимости от выбранного периода.
Пример полученного результата моим вариантом скрипта в конце сообщения и на всякий случай во вложении, но работал скрипт без циклического перебора, было задано фиксированное кол-во проходов, что не универсально, примерно таким образом: Over= ($files | Where {$_.Days -gt 749} | Measure-Object).Count 'Over_SizeKB'= [math]::Round((($files | Where {$_.Days -gt 749} | Measure-Object -Property Length -Sum).sum/1KB),2) '749Days'= ($files | Where {$_.Days -gt 742 -AND $_.Days -le 749} | Measure-Object).Count '749Days_SizeKB'= [math]::Round((($files | Where {$_.Days -gt 742 -AND $_.Days -le 749} | Measure-Object -Property Length -Sum).sum/1KB),2) '742Days'= ($files | Where {$_.Days -gt 735 -AND $_.Days -le 742} | Measure-Object).Count '742Days_SizeKB'= [math]::Round((($files | Where {$_.Days -gt 735 -AND $_.Days -le 742} | Measure-Object -Property Length -Sum).sum/1KB),2) ... ... '7Days'= ($files | Where {$_.Days -gt 0 -AND $_.Days -le 7} | Measure-Object).Count '7Days_SizeKB'= [math]::Round((($files | Where {$_.Days -gt 0 -AND $_.Days -le 7} | Measure-Object -Property Length -Sum).sum/1KB),2) |
|
Отправлено: 15:50, 17-06-2016 | #5 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Я бы скорее выбрал вариант вида |Путь|Интервал возраста|Количество|Размер|Среднее|. А с неё уже потом можно лепить какие угодно варианты, хоть сводные таблицы, хоть диаграммы для разнообразного анализа. В качестве инструмента — LogParser:
LogParser.exe "SELECT EXTRACT_PATH(Path) AS OnlyPath, QUANTIZE(CreationTime, 604800) AS DateInterval, COUNT(*) AS TotalFiles, DIV(SUM(Size), 1024) AS TotalSize, DIV(TotalSize, TotalFiles) AS Average INTO 'Result.csv' FROM '\\SrvFile(01-10)\*.*' WHERE Name <> '.' AND Name <> '..' GROUP BY OnlyPath, DateInterval" -i:FS -recurse:-1 -headers:on -stats:off -oCodepage:1251 -oSeparator:; -o:TSV Хотя, вполне может быть, что я банально не допонял задачу. |
Отправлено: 02:24, 18-06-2016 | #6 |
Новый участник Сообщения: 31
|
Профиль | Отправить PM | Цитировать Iska, Работает шустро, но почему-то результат он мне выдал по папкам. Я не силен в SQL, посему не смогу быстро поправить запрос под свои нужды. Кажется это повод изучить функционал этой программки. Давно собирался.
![]() PowerShell мне как-то ближе. |
Отправлено: 21:40, 20-06-2016 | #7 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата Wheee111:
Цитата Wheee111:
Цитата Wheee111:
Цитата Iska:
Цитата Wheee111:
Цитата:
|
||||||
Отправлено: 01:00, 21-06-2016 | #8 |
Новый участник Сообщения: 31
|
Профиль | Отправить PM | Цитировать Цитата Iska:
Цитата Wheee111:
|
||
Отправлено: 12:15, 21-06-2016 | #9 |
Ветеран Сообщения: 1759
|
Wheee111, Чем вас не устраивает мой пример? Добавьте туда сколько вам нужно точек, хоть на каждый день.
|
Отправлено: 12:36, 21-06-2016 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Создать список имен папок с указанием кол-ва файлов в каждой. | Metallor | Скриптовые языки администрирования Windows | 6 | 24-03-2016 16:53 | |
Подскажите программу(определение субтитров у большого кол-ва файлов)! | Aviator | Видео и аудио: обработка и кодирование | 0 | 09-05-2015 21:27 | |
Разное - [решено] открытие большого кол-ва html файлов | Alexander_88 | Microsoft Windows 8 и 8.1 | 5 | 20-04-2015 20:55 | |
CMD/BAT - [решено] Убрать расширение с большого кол-ва файлов | cher | Скриптовые языки администрирования Windows | 4 | 30-03-2015 16:31 | |
Статистика кол-ва скачевания файла | Friend | Вебмастеру | 1 | 12-11-2003 23:53 |
|