Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] не работает скрипт счет кол-ва и размера файлов

Ответить
Настройки темы
PowerShell - [решено] не работает скрипт счет кол-ва и размера файлов

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


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

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


Господа и господамы, здравствуйте! Беда-печаль - руководство просит проанализировать рост объема данных на файлохранилищах для предсказания роста оных. Ради сей задачи был накидан скриптик, с которым можно ознакомиться ниже, и который, собака такая страшная, отказывается работать. Чую косяк с переносами строк и определением типов. Пример входного файла в конце.
Жду помощи от более опытных коллег.
Код: Выделить весь код
#Задаем путь к 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 файлика):
Код: Выделить весь код
PathFolder;ResFileName
"C:\Users";Users

Отправлено: 21:45, 16-06-2016

 

Ветеран


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

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


Wheee111, Вы словами напишите, что Вы хотите получить.

Отправлено: 01:58, 17-06-2016 | #2



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

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


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


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

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

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


Как пример:
Код: Выделить весь код
$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
Вывод приблизительно такой (колонки по возрасту, значения в формате "общее_кол-во/суммарный_размер в мегабайтах"):
Код: Выделить весь код
1000+     750+    500+      250+      0+
-----     ----    ----      ----      --
966/77,09 70/2,41 189/13,53 155/28,71 595/237,77

Последний раз редактировалось Foreigner, 21-06-2016 в 18:35.

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

Отправлено: 09:36, 17-06-2016 | #4


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


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

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


Изображения
Тип файла: jpg Пример.JPG
(46.1 Kb, 18 просмотров)

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
Благодарности: 8088

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

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


Iska, Работает шустро, но почему-то результат он мне выдал по папкам. Я не силен в SQL, посему не смогу быстро поправить запрос под свои нужды. Кажется это повод изучить функционал этой программки. Давно собирался.
PowerShell мне как-то ближе.

Отправлено: 21:40, 20-06-2016 | #7


Ветеран


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

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


Цитата Wheee111:
Iska, Работает шустро, »
Да, LogParser — это самый быстрый вариант из возможных (кроме, разве что, ручного режима работа с файловой системой), работает весьма эффективно.

Цитата Wheee111:
но почему-то результат он мне выдал по папкам. »
Ну, Вы же вроде бы так:
Цитата Wheee111:
с детализацией до папки департамента. т.е. структура папок выглядит примерно так: \\SrvFile(01-10)\Company(01-06)\Department(01-20)\* »
и хотели, не? Мною предполагалась именно детализация вида:
Цитата Iska:
|Путь|Интервал возраста|Количество|Размер|Среднее|. А с неё уже потом можно лепить какие угодно варианты, хоть сводные таблицы, хоть диаграммы для разнообразного анализа. »
Если нет — поясните подробнее/как-то иначе, попробуем сделать, как потребно.

Цитата Wheee111:
PowerShell мне как-то ближе. »
PowerShell, конечно, гибче. Впрочем, ничто не мешает использовать LogPaser из-под PowerShell, поскольку LogPaser предоставляет сервер Automation и не только:
Цитата:
LogQuery Object
The LogQuery object exposes the main API methods that execute a SQL-Like query and provides access to global parameters controlling the execution of a query.

The object is instantiated with the "MSUtil.LogQuery" ProgId.
The class name of the .NET COM wrapper for this object is "Interop.MSUtil.LogQueryClassClass".

Отправлено: 01:00, 21-06-2016 | #8


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


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

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


Цитата Iska:
Если нет — поясните подробнее/как-то иначе, попробуем сделать, как потребно. »
Полагаю, эта часть и есть ответ на вопрос:
Цитата Wheee111:
имя папки департамента | кол-во и размер файлов старше 2х лет | кол-во и размер файлов созданных в промежутке 749-742 дня назад | кол-во и размер файлов созданных в промежутке 742-735 дней назад | etc... | кол-во и размер файлов созданных в промежутке 7-0 дней назад »

Отправлено: 12:15, 21-06-2016 | #9


Ветеран


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

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


Wheee111, Чем вас не устраивает мой пример? Добавьте туда сколько вам нужно точек, хоть на каждый день.

Отправлено: 12:36, 21-06-2016 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] не работает скрипт счет кол-ва и размера файлов

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

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




 
Переход