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

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

 

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


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

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


Foreigner, тем, что сей способ не универсален. В сообщении #5 я указал, что похожий вариант уже был реализован, и он не удобен в случае расширения временного промежутка.

Отправлено: 21:22, 23-06-2016 | #11



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

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


Ветеран


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

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


Если честно я не понимаю смысла:
Цитата:
на выходе нужно получить большое кол-во точек за неопределенный заранее промежуток времени
Что значит этот промежуток, который заранее не известен и его никак не определяют? Временные точки тоже заранее не известны и их никто не назначает? Уравнение а-ля:
Код: Выделить весь код
a+b=c
Чему равно d?
ЗЫ. Тогда наверное надо все эти данные передавать, как параметры к скрипту.

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


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


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


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

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


Foreigner, примерно так в первом сообщении в не рабочей версии скрипта и есть:
Цитата:
Код: Выделить весь код
$PathToResult = "C:\Temp\"
#задаем "глубину" поиска
$DaysToSearch = 749
#задаем временной промежуток для поиска 
$DaysIntervalToSearch = 7

Отправлено: 21:55, 23-06-2016 | #13


Ветеран


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

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


Такой вариант. Правда неторопливый (но в разумных пределах):
читать дальше »
Код: Выделить весь код
param (

    [int] $deep = 750,
    [int] $interval = 7

)

$dirs = get-childitem c:\root\folder -directory
$result = foreach ($dir in $dirs)
{
    $dirfiles = get-childitem $dir.fullname -file -recurse
    $objectbody = 
    for ($i = 0; $i -le $deep; $i += $interval)
    {
        $files = 
        $dirfiles | where { 
            $_.lastwritetime -le (get-date).adddays(-$i) -and $_.lastwritetime -ge (get-date).adddays(-$($i+$interval))
        }
        $files |
        foreach { $size = 0 } { $size += $_.length / 1mb } { "`'$i+`' = `'$($files.count) / $($size.tostring('f'))`'" }
    }

@"
[pscustomobject] @{
folder = `'$dir`'
$($objectbody -join "`n") 
}
"@ | invoke-expression

}

$result | convertto-csv | out-file result.csv

Вызывать соответственно:
Код: Выделить весь код
.\script -deep 300 -interval 10
.\script -d 300 -i 10
.\script # значения $deep и $interval по умолчанию (750 и 7)

Последний раз редактировалось Foreigner, 24-06-2016 в 11:02.

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

Отправлено: 09:57, 24-06-2016 | #14



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




 
Переход