最近我一直在写剧本,遇到了障碍。我正在删除自动创建的文件夹。我想删除这些文件的旧版本,同时保持新文件夹不变,例如:
我想保留18.212.1021.008_3,所以我想我需要保留创建日期最近的文件夹。
请参见下面的代码:
$Versionarray = 13..20
Get-ChildItem "$env:LOCALAPPDATA\Microsoft\OneDrive" -Recurse | Where-Object {
# Recusivly deletes OneDrive version folders within
# Appdata\local which build up everytime OneDrive
# is installed/script is run
$item = $_
$item -is [System.IO.DirectoryInfo] -and (
$Versionarray | Where-Object { $item.Name.Contains($_) }
)
} | Remove-Item -Recurse -Confirm:$false -ErrorAction SilentlyContinue
答案 0 :(得分:1)
如果您要保留的最新文件夹也是创建时间最新的文件夹,则可以使用以下简单的单行格式:
Get-ChildItem "$env:LOCALAPPDATA\Microsoft\OneDrive" -Directory | sort CreationTime | select -SkipLast 1 | Remove-Item -Recurse -Force
如果只想按名称过滤出特定类型的文件夹,则可以使用简单的正则表达式匹配。我无法为您提供确切的正则表达式(因为我必须知道您的文件夹命名模式),但是它看起来像这样:
Get-ChildItem "$env:LOCALAPPDATA\Microsoft\OneDrive" -Directory | where Name -match '\d\d+' | sort CreationTime | select -SkipLast 1 | Remove-Item -Recurse -Force
(请注意,如果您使用的是旧版Powershell,则此语法可能无法正常工作。如果是这种情况,请告诉我,我将提供兼容的后备解决方案。)
更新
针对您的评论:您的要求仍然不清楚,但是以下是一些入门知识:
如果要确保仅删除“外观”版本文件夹,则可以在where过滤器中调整正则表达式。 _\d+$
将匹配任何带有下划线和数字的内容:
where $_.Name -match '_\d+$'
如果您还想确保这实际上是另一个现有文件夹的版本副本,则也可以进行以下检查:
where { $_.FullName -match '^(?<OriginalPath>.+)_\d+$' -and (Test-Path $Matches.OriginalPath) }