我正在为我的雇主做一个项目-目标是把我们的机器的一个子集,这是相当不断地填补由于过剩的配置文件,许多人谁不再是员工。在做研究对此,我发现这个https://stackoverflow.com/a/72101998/22953610由约翰史密斯,这似乎非常有帮助,正是我们想做的。
然而,我遇到了一个问题:当执行脚本时,它按预期打印,但据我所知,实际上并没有采取任何行动。
$VerbosePreference = 'Continue'
$ExcludedUsers="Public","default","defaultuser0","public","administrator"
$path = "$Env:SystemDrive\users"
## getting the name of the users
## this returns the filtered results below
$useraccounts = Get-ChildItem -Path $path -Exclude $ExcludedUsers | Where-Object {$_.lastwritetime -lt (Get-Date).AddDays(-30)}
## $useraccounts returns
<#
Directory: /Users
UnixMode User Group LastWriteTime Size Name
-------- ---- ----- ------------- ---- ----
drwxr-x--- jacoby staff 5/2/2022 19:04 1056 jacoby
drwxrwxrwt root wheel 3/26/2022 00:21 128 Shared
#>
## $useraccounts.name returns
<#
PS > $useraccounts.name
jacoby
Shared
#>
## if we use get-childitem | get-member we can see that we have access to a lot of
## properties returned like the .name value
#### we don't need any of this
####$sort = $useraccounts | ForEach-Object {$_.Name}
#####$removeaccounts = $sort -join '|'
## ok let's do something here
## for each account in my list
foreach ($account in $useraccounts)
{
## let's write some info so we know what's happening
Write-Verbose -Message ('currently working with {0}' -f $account)
## we want to check moditfication time of folder so we gotta see if it exists
## we want to test c:\users\ the current account \ appdata\local
## $account.FullName gives us c:\users\accountname so we just need to add the rest
$testpath1 = $account.FullName + '\appdata\local'
Write-Verbose -Message ('we generated the path {0}' -f $testpath1)
## imma give you some error checking
## this is ugly because it could be there but we can't access it
if ((Test-Path -Path $testpath1 -ErrorAction SilentlyContinue) -eq $true)
{
## if the path exists here's what we'll do
## get a count of all the file modified in the last 30 days
$count = (Get-ChildItem -Path $testpath1 | Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-30) }).Count
## now that we have a count we can test if the count is less than than 1 (0)
## that means no files in these folders were modified in the last 30 days
if ($count -lt 1) {
####
##
## this is the area where we can take action on the
## folders/files that have not been modified in the
## last 30 days
## you might delete them or just log them somewbere
##
####
Write-Verbose -Message 'no file modified in the last 30 days'
####
## this is your original deletion pipeline
Get-WmiObject -Class Win32_userprofile | Where-Object {($_.LocalPath -contains "$account") -and (!$_.special)} | Remove-WmiObject
##i have not tested this. be careful.
####
}
else {
Write-Verbose -Message ('{0} files have been modified in the last 30 days! We do not want delete this.' -f $count)
####
##
## these is the area where we can take action if the
## files/folder HAVE been modified recently
## we would NOT want to delete these files
##
####
}
}
## do some stuff before ending the for each loop
## maybe write our changes somewhere permanent
}
字符串
我在这里的目标是实际上通过并完全删除所有用户配置文件没有修改在过去30天。
我看到删除管道如下:
####
## this is your original deletion pipeline
Get-WmiObject -Class Win32_userprofile | Where-Object {($_.LocalPath -contains "$account") -and (!$_.special)} | Remove-WmiObject
##i have not tested this. be careful.
####
型
我已经删除了hashtags,以便取消注解。然而,当运行脚本时,我只得到以下结果:
VERBOSE: currently working with C:\Users\#088DFEBE.jpg
VERBOSE: we generated the path C:\Users\#088DFEBE.jpg\appdata\local
VERBOSE: currently working with C:\Users\#76B7EBF1.doc
VERBOSE: we generated the path C:\Users\#76B7EBF1.doc\appdata\local
VERBOSE: currently working with C:\Users\#8A09F1A9.xls
VERBOSE: we generated the path C:\Users\#8A09F1A9.xls\appdata\local
VERBOSE: currently working with C:\Users\#D97B2BA6.pptx
VERBOSE: we generated the path C:\Users\#D97B2BA6.pptx\appdata\local
VERBOSE: currently working with C:\Users\$42D864D7.doc
VERBOSE: we generated the path C:\Users\$42D864D7.doc\appdata\local
VERBOSE: currently working with C:\Users\$649D0AFD.pptx
VERBOSE: we generated the path C:\Users\$649D0AFD.pptx\appdata\local
VERBOSE: currently working with C:\Users\$D4DC362C.xls
VERBOSE: we generated the path C:\Users\$D4DC362C.xls\appdata\local
VERBOSE: currently working with C:\Users\$EA0D76A7.jpg
VERBOSE: we generated the path C:\Users\$EA0D76A7.jpg\appdata\local
型
这就是它所做的一切。
我想知道我做错了什么,它实际上不是通过和删除配置文件?
1条答案
按热度按时间iugsix8n1#
Get-ChildItem
调用也与 files 匹配,您可以通过-Directory
开关来阻止这种情况。AppData
是一个 * 隐藏 * 目录,因此您需要-Force
和Get-ChildItem
来枚举它。Get-CimInstance
)取代了WMI cmdlet(例如,Get-WmiObject
)在PowerShell v3中的部署(于2012年9月发布)。因此,应避免使用WMI cmdlet,尤其是因为PowerShell(Core)v6+(未来的所有工作都将在其中进行)甚至不再 * 具有 * 这些cmdlet。不过,请注意,WMI仍然 * 作为CIM cmdlet的基础。有关更多信息,参见this answer。不过,我建议采用以下精简方法:
字符串
注意事项:上述命令中的**
-WhatIf
公共参数 * 预览 * 操作。删除-WhatIf
,并在确定给定操作将执行所需操作后重新执行。Get-CimInstance
和Remove-CimInstance
CIM cmdlet。Win32_UserProfile
示例的.LastUseTime
属性中推断出来。Remove-LocalUser
调用所做的。profilesToDelete
的Where-Object
调用中使用了公共-OutVariable
参数(注意:* 没有 *$
),从而允许以后通过$profilesToDelete
访问要删除的概要文件。