Вы можете использовать регулярное выражение -replace
в имени каталога, чтобы получить только часть Firstname.Lastname
, пропуская .Vx
и .RENAME
(или .WhatEver
)
Далее, для вашего расчета размера каталога, я полагаю, вам нужен общий размер, включая содержимое вложенных папок, поэтому я бы тоже изменил этот метод:
$ServerHomeDirShare = '\\FileServer\RoamingProfiles\UserData$'
$filter = "(Enabled -eq 'true')"
# get all user accounts from AD; only SamAccountName required
$users = Get-ADUser -Filter $filter | Select-Object -ExpandProperty SamAccountName
# foreach directory in \\server\share check if it has a corresponding ad user
# user SamAccountNames are in format 'FirstName.Lastname', so we need to cut off
# any versioning postfixex from the directory names in order to compare
Get-ChildItem -Path $ServerHomeDirShare -Directory |
Select-Object -Property Name,
@{ n = 'AD User Exist'; e = { $users -contains ($_.Name -replace '^(\w+\.\w+).*', '$1') } },
FullName,
@{ n = 'LastAccessTime'; e = { $_.LastAccessTime.ToString('yyyy-MM-dd HH:mm:ss') } },
@{ n = "Directory Size (MB)"; e = {
Try {
$Size = (Get-ChildItem -Path $_.FullName -Recurse -ErrorAction Stop |
Measure-Object Length -Sum).Sum / 1MB
[math]::Round($Size, 2)
}
Catch {
"ERROR: $($_.Exception.Message)"
}
}
} |
Where-Object { -not $_.'AD User Exist' } |
Export-Csv -NoTypeInformation -Path C:\UserProfilesNotExist-Size.csv
Другой подход может заключаться в фильтрации только каталогов, имя которых не может быть найдено в массиве $ users сразу, а не после. В этом случае вам не понадобится столбец «AD User Exist», потому что вы знаете, что это потерянные пользовательские папки.
Get-ChildItem -Path $ServerHomeDirShare -Directory |
Where-Object { $users -notcontains ($_.Name -replace '^(\w+\.\w+).*', '$1') } |
Select-Object -Property Name, FullName,
@{ n = 'LastAccessTime'; e = { $_.LastAccessTime.ToString('yyyy-MM-dd HH:mm:ss') } },
@{ n = "Directory Size (MB)"; e = {
Try {
$Size = (Get-ChildItem -Path $_.FullName -Recurse -ErrorAction Stop |
Measure-Object Length -Sum).Sum / 1MB
[math]::Round($Size, 2)
}
Catch {
"ERROR: $($_.Exception.Message)"
}
}
} |
Export-Csv -NoTypeInformation -Path C:\UserProfilesNotExist-Size.csv
Детали регулярного выражения
^ Assert position at the beginning of the string
( Match the regular expression below and capture its match into backreference number 1
\w Match a single character that is a “word character” (letters, digits, etc.)
+ Between one and unlimited times, as many times as possible, giving back as needed (greedy)
\. Match the character “.” literally
\w Match a single character that is a “word character” (letters, digits, etc.)
+ Between one and unlimited times, as many times as possible, giving back as needed (greedy)
)
. Match any single character that is not a line break character
* Between zero and unlimited times, as many times as possible, giving back as needed (greedy)