С помощью PowerShell вы можете определить точный размер определенного каталога в Windows (с учетом всех вложенных директорий). Это позволит узнать размер каталог без использования сторонних утилит, таких как TreeSize или WinDirStat. Кроме того, PowerShell позволяет более гибко отфильтровать файлы по типам или размерам, которые нужно учитывать при расчете размера папки.
Для получения размеров файлов в каталогах используются следующие командлеты PowerShell:
- Get-ChildItem (алиас
gci
) — позволяет получить список файлов в директории (включая вложенные объекты) - Measure-Object (алиас
measure
) – складывает размеры всех файлов для получения суммарного размера директории
Например, чтобы получить полный размер директории F:\ISO в Гб, выполните команду:
(Get-ChildItem F:\ISO -force -Recurse -ErrorAction SilentlyContinue| measure Length -sum).sum / 1Gb
Рассмотрим используемые параметры:
-
-Force
— учитывать скрытые и системные файлы -
-Recure
— получать список файлов во вложенных директориях -
-ErrorAction SilentlyContinue
– игонрировать объекты, к которым у текущего пользователя нет доступа -
-measure Length -sum
– сложить размеры всех файлов (свойство Length) -
.sum/ 1Gb
– вывести только суммарный размер в Гб
В данном примере размер директории около 37 Гб (без учета NTFS сжатия). Чтобы округлить результаты до двух символов после запятой, выполните команду:
"{0:N2} GB" -f ((Get-ChildItem F:\ISO -force -Recurse -ErrorAction SilentlyContinue| measure Length -sum).sum / 1Gb)
С помощью PowerShell можно получить суммарный размер всех файлов определенного типа в директории. Например, чтобы узнать сколько места занято ISO файлами, добавьте параметр
*.iso
:
"{0:N2} GB" -f ((Get-ChildItem F:\ISO *.iso -force -Recurse -ErrorAction SilentlyContinue| measure Length -sum).sum / 1Gb)
Можно использовать другие фильтры для выбора файлов, которые учитываются при расчете размера директории. Например, вы можете получить размер файлов, созданных за 2023 год
(gci -force f:\iso –Recurse -ErrorAction SilentlyContinue | ? {$_.CreationTime -gt ‘1/1/23’ -AND $_.CreationTime -lt ‘12/31/23’}| measure Length -sum).sum / 1Gb
Указанная выше PowerShell команда при подсчете размера файлов в каталоге будет выводить неверные данные, если в директории есть символические или жесткие ссылки. Например, в каталоге C:\Windows находится много жестких ссылок на файлы в хранилище компонентов WinSxS. В результате такие файлы могут быть посчитаны несколько раз. Чтобы не учитывать в результатах жесткие ссылки, используйте следующую команду (выполняется довольно долго):
"{0:N2} GB" -f ((gci –force C:\windows –Recurse -ErrorAction SilentlyContinue | Where-Object { $_.LinkType -notmatch "HardLink" }| measure Length -s).sum / 1Gb)
Вывести размер всех вложенных папок первого уровня в директории и количество файлов в каждой из них (в этом примере скрипт выведет размер всех профилей пользователей в C:\Users):
$targetfolder='C:\Users' $dataColl = @() gci -force $targetfolder -ErrorAction SilentlyContinue | ? { $_ -is [io.directoryinfo] } | % { $len = 0 gci -recurse -force $_.fullname -ErrorAction SilentlyContinue | % { $len += $_.length } $filesCount = (gci -recurse -force $_.fullname -File -ErrorAction SilentlyContinue | Measure-Object).Count $dataObject = New-Object PSObject -Property @{ Folder = $_.fullname SizeGb = ('{0:N3}' -f ($len / 1Gb)) -as [single] filesCount=$filesCount } $dataColl += $dataObject } $dataColl | Out-GridView -Title "Размер вложенных каталогов и количество файлов"
% — это алиас для цикла foreach-object.
Скрипт выведет графическую таблицу Out-GridView со списком директорий, их размеров и количество файлов в каждой из них. Вы можете отсортировать каталоги в таблице по их размеру. Вы также можете выгрузить результаты в CSV (
|Export-Csv file.csv
) или Excel файл.
You can use PowerShell to calculate the exact size of a specific folder in Windows (recursively, including all subfolders). This way you can quickly find out the size of the directory on disk without using third-party tools such as TreeSize or WinDirStat. In addition, PowerShell gives you more flexibility to filter or exclude files (by type, size, or date) that you need to consider when calculating folder size.
Use the following PowerShell cmdlets to calculate the size of a folder:
- Get-ChildItem (
gci
alias) — gets a list of files (with sizes) in a directory (including nested subfolders). Previously, we showed you how to use the Get-ChildItem cmdlet to find the largest files on the disk. - Measure-Object (
measure
alias) – sums the sizes of all files to get the total directory size.
For example, to find the size of the D:\ISO directory in GB, run:
(Get-ChildItem D:\ISO -force -Recurse -ErrorAction SilentlyContinue| measure Length -sum).sum / 1Gb
Parameters used:
-Force
– include hidden and system files-Recure
– get a list of files in subfolders-ErrorAction SilentlyContinue
– ignore files and folders the current user is not allowed to access-measure Length -sum
– a sum of all file sizes (the Length property).sum/ 1Gb
– show total size in GB
In this example, the directory size is about 37 GB (this PowerShell command ignores NTFS file system compression if it is enabled).
To round the results to two decimal places, use the command:
"{0:N2} GB" -f ((Get-ChildItem D:\ISO -force -Recurse -ErrorAction SilentlyContinue| measure Length -sum).sum / 1Gb)
PowerShell can find the total size of all files of a particular type in a directory. For example, add the *.iso parameter to find out how much space is taken up by ISO files:
"{0:N2} GB" -f ((Get-ChildItem D:\ISO *.iso -force -Recurse -ErrorAction SilentlyContinue| measure Length -sum).sum / 1Gb)
You can use other filters to select files to be included in the directory size calculation. For example, to see the size of files in the directory created in 2024:
(gci -force D:\ISO –Recurse -ErrorAction SilentlyContinue | ? {$_.CreationTime -gt '1/1/24’ -AND $_.CreationTime -lt '12/31/24'}| measure Length -sum).sum / 1Gb
If there are symbolic or hard links in the directory, the above PowerShell cmdlet displays an incorrect folder size. For example, the C:\Windows
directory contains many hard links to files in the WinSxS folder (Windows Component Store). Such files may be counted several times. Use the following command to ignore hard links:
"{0:N2} GB" -f ((gci –force C:\Windows –Recurse -ErrorAction SilentlyContinue | Where-Object { $_.LinkType -notmatch "HardLink" }| measure Length -s).sum / 1Gb)
Get the sizes of all top-level subfolders in the destination folder and the number of files in each subfolder (in this example, the PowerShell script displays the size of all user profiles in C:\Users
):
$targetfolder='C:\Users' $dataColl = @() gci -force $targetfolder -ErrorAction SilentlyContinue | ? { $_ -is [io.directoryinfo] } | % { $len = 0 gci -recurse -force $_.fullname -ErrorAction SilentlyContinue | % { $len += $_.length } $filesCount = (gci -recurse -force $_.fullname -File -ErrorAction SilentlyContinue | Measure-Object).Count $dataObject = New-Object PSObject -Property @{ Folder = $_.fullname SizeGb = ('{0:N3}' -f ($len / 1Gb)) -as [single] filesCount=$filesCount } $dataColl += $dataObject } $dataColl | Out-GridView -Title "Subfolder sizes and number of files"
%
is an alias for the foreach-object
loop.
The script will display the Out-GridView graphical table listing the directories, their sizes, and how many files they contain. The folders in the table can be sorted by size or number of files in the Out-GridView form. You can also export the results to a CSV (| Export-Csv folder_size.csv
) or to an Excel file.
Folder Size Explorer is similar to Windows Explorer except it calculates folder sizes. Folder Size Explorer calculates folder sizes as you browse them and allows you to
quickly indentify directories on your hard drive or network that are consuming the most disk space. It can also calculate checksums (MD-5, SHA-1, SHA-256 and SHA-512) of
all your files and can export Windows Explorer folder and file lists to csv files. Folder Size Explorer is a simple and fast disk space analyser that also provides
almost all the functionality of the standard Windows Explorer. It runs on both x86 and x64 versions of Windows 10, 8, 7, Vista, and all versions of Windows Server 2019, 2016,
2012, 2008.
|
|
Requirements
Windows 10,8,7,Vista
Checksum SHA-256
6230b27830396e93ac074e4db73a0a91 Total Downloads: 255,770 Download Folder Size ExplorerFolder Size Explorer 2.0 (2MB) |
Квоты диска позволяют администраторам эффективно управлять дисковым пространством на файловых серверах, предотвращая переполнение и контролируя использование ресурсов пользователями. В этой статье мы рассмотрим, как настроить дисковые квоты в Windows и Windows Server, чтобы обеспечить рациональное распределение дискового пространства и избежать проблем с превышением дисковой квоты.
⇓ Запись урока во ВКонтакте ⇓
⇓ Запись урока на RuTuBe ⇓
⇓ Запись урока на YouTuBe ⇓
Весь процесс разделен на этапы. Их будет 6. Первые 5 имеют подготовительный характер, а последний, заключительный, демонстрирует результат.
1) Обзор лабораторного стенда
2) Создание общего ресурса на файловом сервере
3) Создание подразделения, пользователя и группы в Active Directory Windows Server 2016
4) Создание и конфигурирование групповой политики Windows Server 2016
5) Создание и настройка квот дискового пространства
6) Демонстрация результата применения квот на дисковое пространство сервера
Обзор лабораторного стенда
Лабораторный стенд представлен сервером на базе Windows Server 2016 и клиентской машиной на базе Windows 10. Забегая вперед, скажу, что на сервере подняты роли активной директории и файлового сервера, клиентский компьютер добавлен в домен.
Создание общего ресурса на файловом сервере
Создадим общий ресурс на файловом сервере. Для этого в диспетчере серверов перейдем в раздел общие ресурсы. Щелкнем правой кнопкой мыши и создаем ресурс, оставляя при этом параметры по умолчанию.
Создание подразделения, пользователя и группы в Active Directory Windows Server
Далее создадим необходимые элементы в Active Directory Windows Server 2016. Создадим новое подразделение в домене. Откроем оснастку пользователи и компьютеры. Щелкнем на домен “vlab.edu” и создаем подразделение. Назовем его “vlab”.
В этом подразделении аналогично создадим нового пользователя “user1”. Под ним мы будем входить в домен на клиентской машине. И создадим группу “NetDrive”, в разделе групп, в последствии добавив в нее нашего пользователя. Эта группа понадобиться нам как фильтр безопасности для применения групповой политики.
Создание и конфигурирование групповой политики Windows Server
Создадим объект групповой политики. Откроем оснастку «Управление групповой политикой» и в разделе объектов создадим новую. Назовем ее «AddNetDrive».
Теперь давайте изменим ее содержимое. В разделе конфигурации пользователя, необходимо открыть раздел настроек, далее конфигурации windows и выбрать сопоставление дисков. Создадим элемент «сопоставленный диск». В параметрах укажем путь к общему ресурсу, в нашем случае это \\ad1\share, укажем букву диска, и обязательно установим галочку «выполнять в контексте пользователя». Привяжем объект к нашему подразделению … и укажем в фильтре безопасности созданную ранее группу.
Вводим учетные данные и входим в систему под доменной учетной записью “user1”. Проверяем подключился ли у нас сетевой диск. Диск подключен. Но обращаю ваше внимание что на этом диске доступно столько же пространства сколько и на родительском диске общего файлового ресурса. Что бы не допустить переполнения, нам необходимо установить квоту.
Создание и настройка квот дискового пространства
Давайте перейдем к ее созданию. Для того что бы создать квоту, необходимо открыть диспетчер ресурсов файлового сервера. В разделе квот создаем новую квоту и назначаем ей параметры по умолчанию, выбирая их из шаблона.
Этого вполне достаточно что бы изучить принцип действия квотирования и понять, как он функционирует. Если вас интересую вопросы по «тонкой» настройке квот, оставляйте их в комментариях под видео, постараюсь всем ответить.
Вернемся на клиентский ПК и удостоверимся что квота применена и функционирует. Доступное для использования общего ресурса пространство ограничено размером в 100МБ. И теперь чисто технический используя этот сетевой ресурс допустить переполнения родительского диска невозможно
Итог: на мой взгляд данная технология позволяет более эффективно использовать ресурсы сервера и осуществлять мониторинг и контроль рационального использования дискового пространства. К тому же она позволяет избежать ряда проблем связанных с переполнением дисков.
Джеффри Хикс опубликовал очередную статью по PowerShell, посвященную на этот раз управлению файловыми серверами. Мы решили разбить ее на две части: построение отчетов по файловому серверу и непосредственно управление файловыми шарами. В первой части рассмотрим отчеты.
В посте будут рассмотрены следующие вопросы:
- Как вывести список всех сетевых папок на компьютере (компьютерах)
- Создаем отчеты о размерах сетевых папок
- Определяем владельцев файлов
- Находим дату создания файлов выявляем «старые» файлы и файлы, созданные за определенный промежуток времени)
Итак, под катом вы найдете перевод статьи File Server Management with Windows PowerShell.
Получаем все сетевые папки
Начнем с того, что определим, что же расшарено. Задача проста: просто осуществляем запрос класса Win32_Share, чтобы использовать Windows Management Instrumentation (WMI). Вам даже не нужно логиниться на файловом сервере. Вы можете запустить эту команду откуда угодно.
Get-WmiObject -class -Win32_Share -computername chi-fp01
Вместо chi-fp01 укажем имя интересующего нас компьютера
Запустив эту команду Вы получите все сетевые папки, включая принтеры (если таковые имеются). Но так как мы говорим о файловых шарах, то давайте ограничим запрос. Все экземпляры Win32_Share имеют свойство Type, как показано в таблице 1.
Добавим фильтр в первоначальную команду:
Get-WmiObject -class -Win32_Share -computername chi-fp01 –filter "Type=0"
Тем самым мы выводим только нужную информацию.
Но если вы ищите также и скрытые папки – те, которые заканчиваются знаком доллара ($) – фильтр придется слегка переписать:
Get-WmiObject -Class win32_share -computername chi-fp01 –filter "Type=0 AND name like '%$'"
В WMI знак процента (%) используется вместо знака подстановки (wildcard). Вывести все папки, кроме тех, которые скрыты чуть сложнее.
Get-WmiObject -Class win32_share -computername chi-fp01–filter "type=0 AND name like '%[^$]'"
Команда выведен все объекты Win32_Share, у которых свойство Type равно 0 и имя не заканчивается на $.
Получаем размер сетевой папки
Довольно часто необходима информация о том, сколько места занимают файловые шары. Используем Get-ChildItem, или его сокращение dir, и передадим результаты в Measure-Object:
dir c:\shares\public -recurse | where {-Not $_.PSIsContainer}| Measure-Object -Property length -Sum -Minimum -Maximum
В итоге вы получите информацию об общем числе объектов, размер в байтах, наименьшие и наибольшее размерах файлов. В предыдущей команде, применил фильтр. В PowerShell 3.0 то же самое можно сделать проще, однако та команда, которую я использовал, работает как v2.0, так и 3.0. Ее лучше всего запускать локально. Код в примере 1 комбинирует эту команду с нашей техникой WMI, чтобы получить отчет о размере высокоуровневых папок.
Пример 1: Отчет о размерах высокоуровневых сетевых папок
$share=Get-WmiObject -Class Win32_Share -ComputerName
CHI-FP01 -filter "name='Sales'"
$sb={
Param ($path)
dir $path | where {$_.PSIscontainer} |
foreach {
$stats=dir $_.Fullname -recurse -errorAction
"SilentlyContinue" | where {-NOT $_.PSIscontainer} |
Measure-object -Property Length -sum
New-Object -TypeName PSObject -Property @{
Computername=$env:Computername
Path=$_.Name
Fullname=$_.Fullname
SizeKB=[math]::Round(($stats.sum/1KB),2)
NumberFiles=$stats.count
} #property
} #foreach
} #sb
$results=Invoke-Command -ScriptBlock $sb -ComputerName
$share.__SERVER -ArgumentList @($share.path)
-HideComputerName
Вы можете форматировать или обрабатывать $results как вашей душе будет угодно. Нужна удобоваримая таблица? Просто используйте следующую команду:
$results | Format-Table Computername,Fullname,SizeKB,NumberFiles -autosize
Тем самым можно сделать полный отчет по использованию всех папок на файловом сервере не составляет труда. Сэкономьте время, воспользуетесь примером 2.
Пример 2: Отчет об использовании файловых шар
$sb={
#Get the file shares locally.
$shares=Get-WmiObject -Class Win32_Share -filter "type=0"
foreach ($share in $shares) {
#Suppress any access denied error messages.
Write-Host "Measuring $($share.path)" -ForegroundColor Green
$stats=dir $share.path -Recurse -ErrorAction SilentlyContinue |
Where {-Not $_.PSIscontainer} |
Measure-Object -Property Length -Sum
$hash=@{
Computername=$env:Computername
Path=$share.path
Share=$share.Name
SizeKB=[math]::Round(($stats.sum/1KB),2)
Files=$stats.count
}
#Write a custom object to the pipeline for each share.
New-Object -TypeName PSObject -Property $hash
} #foreach $share
}#sb
$results = Invoke-Command -ScriptBlock $sb -ComputerName
CHI-FP01 -HideComputerName
И снова я слегка отформатирую таблицу.
$results | sort SizeKB –Descending | Select Computername,Share,SizeKB,Files | ft -auto
Получаем файлы по владельцу
Двигаемся дальше – найдем владельцев файлов. Если вы используете квоты, отчеты уже наверняка получаете. В противном случае, все, что вам нужно – это извлечь ACL файла, который включает в себя владельца, и агрегировать результаты. Лучше всего добавить владельца файла в качестве кастомного свойства
$data=dir | where {-not $_.PSIsContainer} | select name, @{Name="Owner";Expression={(Get-ACL $_.fullname).Owner}}, length
Мы можем группировать по свойству нового владельца и затем обрабатывать новый объект.
$data | group owner | Select Name,Count,@{Name="Size";Expression={($_.Group | Measure-Object -Property Length -sum).Sum}}
Пара усилий и вы можете применить тот же подход к файловой шаре, как указано в коде примера 3.
Пример 3: Группируем файловые шары по владельцу
$sb={
Param($path)
$data=dir $path |
where {-not $_.PSIsContainer} |
select name, @{Name="Owner";Expression=
{(Get-ACL $_.fullname).Owner}},length
$data | group -property owner |
Select @{Name="Computername";Expression={$env:computername}},
@{Name="Path";Expression={$path}},Name,Count,@{Name=
"Size";Expression={
($_.Group | Measure-Object -Property Length -sum).Sum}}
} #sb
<#
Run the command remotely and suppress the RunspaceID since we
don't really need it.
#>
Invoke-Command -ScriptBlock $sb -ComputerName CHI-FP01
-ArgumentList @("c:\shares\public") -HideComputerName |
Select * -ExcludeProperty RunspaceID
Я также должен указать на то, что могут проблемы: с файлами, имя которых более 260 символов или содержит необычные символы, особенно если вы пытаетесь запустить Get-ACL. В PowerShell 3.0 этот командлет имеет параметр -LiteralPath, что помогает решить вышеуказанные проблемы.
Опять выведем читаемую таблицу.
$data | Sort Size | ft -auto
Получаем файлы по дате создания
Последняя техника создания отчетов, которую я хочу продемонстрировать – это создание отчета с последними созданными файлами. Фактически, мы создаем коллекцию объектов, которую можем использовать несколькими способами. Возможно вы захотите использовать объекты или удалить или переместить файлы, или можете захотите построить отчет, который можно отправить руководству. Всегда создавайте команды PowerShell так, чтобы потом их можно использовать.
Определить возраст файл не так просто. В PowerShell файловый объект (объект типа файл) имеет несколько свойств, которые вы возможно захотите использовать. Например, команда:
get-item c:\work\wishlist.txt | Format-List Name,*time
дает вывод, представленный на скриншоте ниже.
Лично я считаю, что лучше использовать LastWriteTime, который обозначает, когда к файлу в последний раз обращались. Мне встречались ситуации, когда LastAccessTime обновлялся через сторонние программы, например, антивирус, что само по себе уже не означает правды. И LastAccessTime был деактивировал еще со времени Windows Vista, хотя вы можете его включить. Вам также нужно быть осторожным, потому что эти значения могут меняться в зависимости от того, копируете ли вы или перемещаете файлы между дисками (between volumes). Но вы можете решить это сами. Используя этот файл как пример, мы может заставить PowerShell сказать нам, насколько стар файл. См. пример 4.
Пример 4. Определяем возраст файлов
PS C:\work> get-item wishlist.txt | format-list name,
CreationTime,LastWriteTime,
>> @{Name="Age";Expression={(Get-Date)-$_.LastWriteTime}},
>> @{Name="Days";Expression={((Get-Date)
-$_.LastWriteTime).TotalDays}}
>>
Name : wishlist.txt
CreationTime : 11/23/2010 10:31:10 PM
LastWriteTime : 2/15/2011 7:36:34 AM
Age : 511.06:42:17.4251748
Days : 511.279372271039
Свойство Age является объектом TimeSpan, и свойство Days является просто свойством TotalDays этого объекта. Но так как мы можем этом сделать для одного файла, мы можем сделать и для других Давайте взглянем на мою общую папку и найдем все файлы, которые не менялись за последние 400 дней.
dir c:\shares\public -recurse | Select Fullname,CreationTime,LastWriteTime,
@{Name="Age";Expression={(Get-Date)-$_.LastWriteTime}},
@{Name="Days";Expression={[int]((Get-Date) -$_.LastWriteTime).TotalDays}},
@{Name="Owner";Expression={(Get-ACL $_.fullname).Owner}} | Where {$_.Days -ge 400} | Sort Days -Descending
Я пойду дальше и включу еще и владельца файла. На скриншоте ниже показаны результаты от запуска этого код в удаленной сессии на моем файловом сервере.
Я могу сохранить эти результаты в переменную и использовать их в любое время. Так как у меня есть полное имя файла, передать в другую команду, например, Remove-Item, не составит труда.
Одной из моих любимых техник является определение того, сколько файлов было изменено за год.
dir c:\shares\sales -recurse | Select Fullname,LastWriteTime,
@{Name="Age";Expression={(Get-Date)-$_.LastWriteTime}},
@{Name="Year";Expression={$_.LastWriteTime.Year}} | Group-Object Year | Sort Name
Как вы можете видеть на скриншоте, все выглядит причесано. Нужны детали? Можно проанализировать свойство Group, которое представляет собой коллекцию файлов.
Полезно знать, сколько файлов не изменялось за 30, 90 или 180 дней. К сожалению, простого способа использовать Group-Object для этого не существует, поэтому мне необходимо придется «пойти иным путем»; смотрите пример 5.
Пример 5: Определяем период изменения файлов
$path="c:\scripts"
#Get some other properties in case we want to further
#break down each bucket.
$files=dir $path -recurse |
Select Fullname,CreationTime,LastWriteTime,Length,
@{Name="Age";Expression={(Get-Date)-$_.LastWriteTime}},
@{Name="Days";Expression={[int]((Get-Date)
-$_.LastWriteTime).TotalDays}}
$hash=@{
Path=$path
Over= ($files | Where {$_.Days -gt 365} | Measure-Object).Count
'365Days'= ($files | Where {$_.Days -gt 180 -AND
$_.Days -le 365} | Measure-Object).Count
'180Days'= ($files | Where {$_.Days -gt 90 -AND
$_.Days -le 180} | Measure-Object).Count
'90Days'= ($files | Where {$_.Days -gt 30 -AND
$_.Days -le 90} | Measure-Object).Count
'30Days'= ($files | Where {$_.Days -gt 7 -AND
$_.Days -le 30} | Measure-Object).Count
'7Days'= ($files | Where {$_.Days -gt 0 -AND
$_.Days -le 7} | Measure-Object).Count
}
New-Object -TypeName PSObject -Property $hash |
Select Path,Over,365Days,180Days,90Days,30Days,7Days
На рисунке ниже показан результат, когда я запустил этот код для папки с моими скриптами, которая, как я знаю, имеет плотное распределение по возрасту (decent age distribution). Мой код не включает в себя актуальные файлы, но это было бы слишком сложно изменить мой пример.
За основу поста использована первая часть статьи File Server Management with Windows PowerShell.
Бонус:
Кстати, о том, как найти файлы с помощью PowerShell и WMI Джеффри Хикс пишет в своем блоге (часть 1 и 2).
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Во второй части статьи рассматриваются вопросы создания и удаления файловых шар и делегирования прав доступа к ним. Был бы интересен ее перевод?
Проголосовали 146 пользователей. Воздержались 14 пользователей.