Powershell:递归地设置配置文件的继承并删除旧配置文件
Powershell: Recursively set inheritance on profiles and also delete old profiles
场景:我们有漫游配置文件在工作。在我们将客户端机器从 XP 升级到 Win7 的过程中,Win7.v2 子文件夹没有在设置继承标志的情况下创建(小问题很容易修复)。除此之外,我们还有大量需要清除的旧配置文件(winxp、winxp.old、winxp_old、winxp_、win7.v2_old 等)。我想出了一个脚本来尝试执行此操作,但我坚持删除旧配置文件。
环境: 漫游配置文件采用以下格式:
- P:\Profiles$\User1\WIN7.V2
- P:\Profiles$\User1\winxp
- P:\Proifles$\User1\WIN7.V2_old
- ...
我是自学成才的,所以为垃圾脚本道歉。我还没有使用 $date 变量,但希望不要删除过去 10 天内修改过的任何文件夹。
cls
# Date and time script is started
$StartDate = date
# Date variable for 30 day buffer
$date = (Get-Date).AddDays(-30)
# Sets path and log variables
$ProfilePath = "D:\Work\Profiles"
$LogPath = "D:\Work\Logs"
$Takeownlog = "$LogPath\Takeown.log"
$Icaclslog = "$LogPath\icacls.log"
$NoWIN7FolderLog = "$LogPath\NoWin7Folder.log"
# Deletes any previous log entries
del $Takeownlog
del $Icaclslog
del $NoWIN7FolderLog
# Gets Subfolder list
$FolderList = Get-ChildItem $ProfilePath
# Main body of script.
foreach ($SubFolder in $FolderList)
{
$winxp = "$ProfilePath$subfolder\winxp"
$winos = "$ProfilePath$subfolder\%winos%"
$winvar = "$ProfilePath$subfolder\win"
# Checks if the WIN7.V2 folder exists. If it doesn't, it logs it and moves to next folder
if(-not(Test-Path -path $ProfilePath$SubFolder\WIN7.V2)){
Write-Host "$SubFolder\WIN7.V2 does not exist. Moving on..." -ForegroundColor Red
Write-Output "$ProfilePath$SubFolder\WIN7.V2 does not exist" | Out-File $NoWIN7FolderLog -Append -encoding default
} Else
{
# If the WIN7.V2 folder does exist it will recursively set Ownership to Administrators and then set the inheritance on the WIN7.V2 folder
Write-Host "Fixing ownership and inheritance: $ProfilePath$SubFolder" -foregroundcolor Green
Write-Output "Fixing ownership and ineritance: $ProfilePath$SubFolder\WIN7.V2" | Out-File $Takeownlog -append -encoding Default
takeown /f $ProfilePath$SubFolder\WIN7.V2 /A /R /D Y | Out-File $Takeownlog -append -encoding Default
Write-Output "" | Out-File $Takeownlog -append -encoding Default
#
Write-Output "" | Out-File $Icaclslog -append -encoding Default
Write-Output "Fixing inheritance: $ProfilePath$SubFolder\WIN7.V2" | Out-File $Icaclslog -append -encoding Default
ICACLS $ProfilePath$SubFolder\WIN7.V2 /inheritance:e /c /t | Out-File $Icaclslog -append -encoding Default
}
# Deletes any old profiles winxp or win7.v2_*
Write-Host "Removing any old profiles..."
if(Test-Path -path $winxp){
#if((-not(Test-Path -Path $winxp)) -and (-not(Test-Path -Path $winos)) -and (-not(Test-Path -Path $winvar)) {
write-host "No old profiles to delete for $SubFolder"
} Else
{
# If any old profiles are found it will delete them
Write-Host "Old profiles found for $subfolder. Deleting now..."
Remove-Item -Path $winxp
}
}
Write-Host ""
$EndDate = date
Write-Host "Started: $StartDate"
Write-Host "Ended: $EndDate"
Write-Host ""
重置继承的脚本的第一部分工作正常,如下所示:
Fixing ownership and inheritance: D:\Work\Profiles\mcbridt
Fixing ownership and inheritance: D:\Work\Profiles\singhj
Fixing ownership and inheritance: D:\Work\Profiles\test1
test2\WIN7.V2 does not exist. Moving on...
Started: 04/13/2015 16:25:09
Ended: 04/13/2015 16:25:09
但是删除任何 'old' 配置文件的第二部分根本不起作用。我已经尝试了多次 remove-item 的迭代,但终究无法弄清楚。我感谢任何建议和修复。
非常感谢
如果使用 Remove-Item -Path $winxp -recurse
,删除命令会更好用
此外,更重要的是,您的测试 xp 部分的逻辑似乎是倒退的。
if(Test-Path -path $winxp){
write-host "No old profiles to delete for $SubFolder"
} Else{
Write-Host "Old profiles found for $subfolder. Deleting now..."
Remove-Item -Path $winxp}
应该是……
if(Test-Path -path $winxp){
Write-Host "Old profiles found for $subfolder. Deleting now..."
Remove-Item -Path $winxp -Recurse
}Else{
write-host "No old profiles to delete for $SubFolder"}
除此之外,如果脚本像您的示例输出中一样命中前后的部分,那么它看起来应该命中该部分。
$limit = (Get-Date).AddDays(-10)
$path = "$ProfilePath$subfolder\winxp"
# Delete files older than the $limit.
if(Test-Path -path $winxp){
Write-Host "Old profiles found for $subfolder. Deleting now..."
Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force
} Else{
write-host "No old profiles to delete for $SubFolder"}
在我的脚本中使用 -force 来删除只读文件和隐藏文件,另外你可以在脚本末尾使用 -whatif 来查看如果脚本 运行
会发生什么
非常感谢上面的 2 位用户能够引导我朝着正确的方向前进。经过一些轻微的修改后,我能够让它工作。它不漂亮,但它有效。
cls
# Date and time script is started
$StartDate = date
# Date variable for 30 day buffer
$date = (Get-Date).AddDays(-30)
# Sets path and log variables
$ProfilePath = "<local drive>\<share>"
$LogPath = "C:\temp"
$Takeownlog = "$LogPath\Takeown.log"
$Icaclslog = "$LogPath\icacls.log"
$NoWIN7FolderLog = "$LogPath\NoWin7Folder.log"
# Deletes any previous log entries
del $Takeownlog -ErrorAction SilentlyContinue
del $Icaclslog -ErrorAction SilentlyContinue
del $NoWIN7FolderLog -ErrorAction SilentlyContinue
# Gets Subfolder list
$FolderList = Get-ChildItem $ProfilePath
# Main body of script.
foreach ($SubFolder in $FolderList)
{
# Sets commonly known 'old' profile folder names
$winxpold = "$ProfilePath$SubFolder\winx*"
$winosold = "$ProfilePath$subfolder\%win*"
$win7old = "$ProfilePath$subfolder\WIN7.V2.*"
$win7old2 = "$ProfilePath$SubFolder\WIN7.V2_*"
# Checks if the WIN7.V2 folder exists. If it doesn't, it logs it and moves to next folder
if(-not(Test-Path -path $ProfilePath$SubFolder\WIN7.V2)){
Write-Host "No WIN7.V2 folders exists for: $subfolder" -ForegroundColor Red
Write-Output "No WIN7.V2 folders exists for: $subfolder" | Out-File $NoWIN7FolderLog -Append -encoding default
} Else
{
# If the WIN7.V2 folder does exist it will recursively set Ownership to Administrators and then set the inheritance on the WIN7.V2 folder
Write-Host "Fixing ownership and inheritance for: $SubFolder" -foregroundcolor Green
Write-Host "Path: $ProfilePath$SubFolder" -ForegroundColor Green
Write-Output "Fixing ownership and ineritance for: $ProfilePath$SubFolder\WIN7.V2" | Out-File $Takeownlog -append -encoding Default
takeown /f $ProfilePath$SubFolder\WIN7.V2 /A /R /D Y | Out-File $Takeownlog -append -encoding Default
Write-Output "" | Out-File $Takeownlog -append -encoding Default
#
Write-Output "" | Out-File $Icaclslog -append -encoding Default
Write-Output "Fixing inheritance: $ProfilePath$SubFolder\WIN7.V2" | Out-File $Icaclslog -append -encoding Default
ICACLS $ProfilePath$SubFolder\WIN7.V2 /inheritance:e /c /t | Out-File $Icaclslog -append -encoding Default
}
# Deletes any old profiles winxp or win7.v2_*
if((Test-Path -path $winxpold) -or
(Test-path -Path $winosold) -or
(Test-path -Path $Win7old) -or
(Test-Path -path $win7old2)){
Write-Host "Old profiles found for: $subfolder. Deleting now..." -ForegroundColor Yellow
Write-Output "Old profiles found for: $subfolder. Deleting now..." | Out-File $Icaclslog -append -encoding Default
Get-ChildItem -Path $ProfilePath$subfolder -Force |
Where-Object { $_.PSIsContainer -and $_.LastWriteTime -lt $date -and $_.Name -like "winx*" -or $_.Name -like "%win*" -or $_.Name -like "WIN7.V2.*" -or $_.Name -like "WIN7.V2_*" } |
Remove-Item -Recurse -Force
} Else{
write-host "No old profiles to delete for: $SubFolder" -ForegroundColor Green}
Write-Host ""
}
Write-Host ""
$EndDate = date
Write-Host "Started: $StartDate"
Write-Host "Ended: $EndDate"
Write-Host ""
场景:我们有漫游配置文件在工作。在我们将客户端机器从 XP 升级到 Win7 的过程中,Win7.v2 子文件夹没有在设置继承标志的情况下创建(小问题很容易修复)。除此之外,我们还有大量需要清除的旧配置文件(winxp、winxp.old、winxp_old、winxp_、win7.v2_old 等)。我想出了一个脚本来尝试执行此操作,但我坚持删除旧配置文件。
环境: 漫游配置文件采用以下格式:
- P:\Profiles$\User1\WIN7.V2
- P:\Profiles$\User1\winxp
- P:\Proifles$\User1\WIN7.V2_old
- ...
我是自学成才的,所以为垃圾脚本道歉。我还没有使用 $date 变量,但希望不要删除过去 10 天内修改过的任何文件夹。
cls
# Date and time script is started
$StartDate = date
# Date variable for 30 day buffer
$date = (Get-Date).AddDays(-30)
# Sets path and log variables
$ProfilePath = "D:\Work\Profiles"
$LogPath = "D:\Work\Logs"
$Takeownlog = "$LogPath\Takeown.log"
$Icaclslog = "$LogPath\icacls.log"
$NoWIN7FolderLog = "$LogPath\NoWin7Folder.log"
# Deletes any previous log entries
del $Takeownlog
del $Icaclslog
del $NoWIN7FolderLog
# Gets Subfolder list
$FolderList = Get-ChildItem $ProfilePath
# Main body of script.
foreach ($SubFolder in $FolderList)
{
$winxp = "$ProfilePath$subfolder\winxp"
$winos = "$ProfilePath$subfolder\%winos%"
$winvar = "$ProfilePath$subfolder\win"
# Checks if the WIN7.V2 folder exists. If it doesn't, it logs it and moves to next folder
if(-not(Test-Path -path $ProfilePath$SubFolder\WIN7.V2)){
Write-Host "$SubFolder\WIN7.V2 does not exist. Moving on..." -ForegroundColor Red
Write-Output "$ProfilePath$SubFolder\WIN7.V2 does not exist" | Out-File $NoWIN7FolderLog -Append -encoding default
} Else
{
# If the WIN7.V2 folder does exist it will recursively set Ownership to Administrators and then set the inheritance on the WIN7.V2 folder
Write-Host "Fixing ownership and inheritance: $ProfilePath$SubFolder" -foregroundcolor Green
Write-Output "Fixing ownership and ineritance: $ProfilePath$SubFolder\WIN7.V2" | Out-File $Takeownlog -append -encoding Default
takeown /f $ProfilePath$SubFolder\WIN7.V2 /A /R /D Y | Out-File $Takeownlog -append -encoding Default
Write-Output "" | Out-File $Takeownlog -append -encoding Default
#
Write-Output "" | Out-File $Icaclslog -append -encoding Default
Write-Output "Fixing inheritance: $ProfilePath$SubFolder\WIN7.V2" | Out-File $Icaclslog -append -encoding Default
ICACLS $ProfilePath$SubFolder\WIN7.V2 /inheritance:e /c /t | Out-File $Icaclslog -append -encoding Default
}
# Deletes any old profiles winxp or win7.v2_*
Write-Host "Removing any old profiles..."
if(Test-Path -path $winxp){
#if((-not(Test-Path -Path $winxp)) -and (-not(Test-Path -Path $winos)) -and (-not(Test-Path -Path $winvar)) {
write-host "No old profiles to delete for $SubFolder"
} Else
{
# If any old profiles are found it will delete them
Write-Host "Old profiles found for $subfolder. Deleting now..."
Remove-Item -Path $winxp
}
}
Write-Host ""
$EndDate = date
Write-Host "Started: $StartDate"
Write-Host "Ended: $EndDate"
Write-Host ""
重置继承的脚本的第一部分工作正常,如下所示:
Fixing ownership and inheritance: D:\Work\Profiles\mcbridt
Fixing ownership and inheritance: D:\Work\Profiles\singhj
Fixing ownership and inheritance: D:\Work\Profiles\test1
test2\WIN7.V2 does not exist. Moving on...
Started: 04/13/2015 16:25:09
Ended: 04/13/2015 16:25:09
但是删除任何 'old' 配置文件的第二部分根本不起作用。我已经尝试了多次 remove-item 的迭代,但终究无法弄清楚。我感谢任何建议和修复。
非常感谢
如果使用 Remove-Item -Path $winxp -recurse
此外,更重要的是,您的测试 xp 部分的逻辑似乎是倒退的。
if(Test-Path -path $winxp){
write-host "No old profiles to delete for $SubFolder"
} Else{
Write-Host "Old profiles found for $subfolder. Deleting now..."
Remove-Item -Path $winxp}
应该是……
if(Test-Path -path $winxp){
Write-Host "Old profiles found for $subfolder. Deleting now..."
Remove-Item -Path $winxp -Recurse
}Else{
write-host "No old profiles to delete for $SubFolder"}
除此之外,如果脚本像您的示例输出中一样命中前后的部分,那么它看起来应该命中该部分。
$limit = (Get-Date).AddDays(-10)
$path = "$ProfilePath$subfolder\winxp"
# Delete files older than the $limit.
if(Test-Path -path $winxp){
Write-Host "Old profiles found for $subfolder. Deleting now..."
Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force
} Else{
write-host "No old profiles to delete for $SubFolder"}
在我的脚本中使用 -force 来删除只读文件和隐藏文件,另外你可以在脚本末尾使用 -whatif 来查看如果脚本 运行
会发生什么非常感谢上面的 2 位用户能够引导我朝着正确的方向前进。经过一些轻微的修改后,我能够让它工作。它不漂亮,但它有效。
cls
# Date and time script is started
$StartDate = date
# Date variable for 30 day buffer
$date = (Get-Date).AddDays(-30)
# Sets path and log variables
$ProfilePath = "<local drive>\<share>"
$LogPath = "C:\temp"
$Takeownlog = "$LogPath\Takeown.log"
$Icaclslog = "$LogPath\icacls.log"
$NoWIN7FolderLog = "$LogPath\NoWin7Folder.log"
# Deletes any previous log entries
del $Takeownlog -ErrorAction SilentlyContinue
del $Icaclslog -ErrorAction SilentlyContinue
del $NoWIN7FolderLog -ErrorAction SilentlyContinue
# Gets Subfolder list
$FolderList = Get-ChildItem $ProfilePath
# Main body of script.
foreach ($SubFolder in $FolderList)
{
# Sets commonly known 'old' profile folder names
$winxpold = "$ProfilePath$SubFolder\winx*"
$winosold = "$ProfilePath$subfolder\%win*"
$win7old = "$ProfilePath$subfolder\WIN7.V2.*"
$win7old2 = "$ProfilePath$SubFolder\WIN7.V2_*"
# Checks if the WIN7.V2 folder exists. If it doesn't, it logs it and moves to next folder
if(-not(Test-Path -path $ProfilePath$SubFolder\WIN7.V2)){
Write-Host "No WIN7.V2 folders exists for: $subfolder" -ForegroundColor Red
Write-Output "No WIN7.V2 folders exists for: $subfolder" | Out-File $NoWIN7FolderLog -Append -encoding default
} Else
{
# If the WIN7.V2 folder does exist it will recursively set Ownership to Administrators and then set the inheritance on the WIN7.V2 folder
Write-Host "Fixing ownership and inheritance for: $SubFolder" -foregroundcolor Green
Write-Host "Path: $ProfilePath$SubFolder" -ForegroundColor Green
Write-Output "Fixing ownership and ineritance for: $ProfilePath$SubFolder\WIN7.V2" | Out-File $Takeownlog -append -encoding Default
takeown /f $ProfilePath$SubFolder\WIN7.V2 /A /R /D Y | Out-File $Takeownlog -append -encoding Default
Write-Output "" | Out-File $Takeownlog -append -encoding Default
#
Write-Output "" | Out-File $Icaclslog -append -encoding Default
Write-Output "Fixing inheritance: $ProfilePath$SubFolder\WIN7.V2" | Out-File $Icaclslog -append -encoding Default
ICACLS $ProfilePath$SubFolder\WIN7.V2 /inheritance:e /c /t | Out-File $Icaclslog -append -encoding Default
}
# Deletes any old profiles winxp or win7.v2_*
if((Test-Path -path $winxpold) -or
(Test-path -Path $winosold) -or
(Test-path -Path $Win7old) -or
(Test-Path -path $win7old2)){
Write-Host "Old profiles found for: $subfolder. Deleting now..." -ForegroundColor Yellow
Write-Output "Old profiles found for: $subfolder. Deleting now..." | Out-File $Icaclslog -append -encoding Default
Get-ChildItem -Path $ProfilePath$subfolder -Force |
Where-Object { $_.PSIsContainer -and $_.LastWriteTime -lt $date -and $_.Name -like "winx*" -or $_.Name -like "%win*" -or $_.Name -like "WIN7.V2.*" -or $_.Name -like "WIN7.V2_*" } |
Remove-Item -Recurse -Force
} Else{
write-host "No old profiles to delete for: $SubFolder" -ForegroundColor Green}
Write-Host ""
}
Write-Host ""
$EndDate = date
Write-Host "Started: $StartDate"
Write-Host "Ended: $EndDate"
Write-Host ""