Wheee111
16-06-2016, 21:45
Господа и господамы, здравствуйте! Беда-печаль - руководство просит проанализировать рост объема данных на файлохранилищах для предсказания роста оных. Ради сей задачи был накидан скриптик, с которым можно ознакомиться ниже, и который, собака такая страшная, отказывается работать. Чую косяк с переносами строк и определением типов. Пример входного файла в конце.
Жду помощи от более опытных коллег.
#Задаем путь к 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
Жду помощи от более опытных коллег.
#Задаем путь к 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