Loops Powershell删除最旧的项目
我试图使用do-while循环删除多个目录中的旧文件(从最旧的目录开始),直到剩下一个目录为止,此时程序应该结束。仅当运行时目录中有多个文件时,程序才应运行 这是我的环境:Loops Powershell删除最旧的项目,loops,powershell,for-loop,do-while,Loops,Powershell,For Loop,Do While,我试图使用do-while循环删除多个目录中的旧文件(从最旧的目录开始),直到剩下一个目录为止,此时程序应该结束。仅当运行时目录中有多个文件时,程序才应运行 这是我的环境: 顶部文件夹 文件夹1 文件夹2 等 在文件夹1、文件夹2等中,应该只有一个文件。脚本应该删除除最新文件以外的所有内容,如果其中只有一个文件,则什么也不删除 我使用以下代码完成了这项工作: $basedir = "C:\Test" Set-Location -Path C:\Test $a = Get-ChildIt
- 顶部文件夹
- 文件夹1
- 文件夹2
- 等
$basedir = "C:\Test"
Set-Location -Path C:\Test
$a = Get-ChildItem -recurse $basedir
if ($a.Count -gt 1) {
do
{
$a | Sort-Object LastWriteTime -Descending | Select-Object -Last 1 | remove-item
}
while
(
$a.Count -gt 1
)
}
Brad要修复您的问题,您应该在每次通过循环时重新定义$a,或者干脆避免使用$a$a不会因为创建对象时存在的子项已更改而更改 另一种方法是只选择文件夹中最后的n-1项
#Get Items that aren't folders
$items = Get-ChildItems "c:\test" | ? {!($_.PSIsContainer)}
#Get a count - this is easier in PoSh 3
$itemCount = ($items | Measure-Object).Count
if ($itemCount -gt 1){
$items | Sort-Object LastWriteTime -Descending | Select-Object -Last ($itemCount - 1) | Remove-Item
}
递归地做这件事也相当容易。首先,我们将获得执行工作所需的所有文件夹,然后将上面的代码移动到foreach循环中:
$folders = Get-ChildItems "C:\test" -recurse | ? {$_.PSIsContainer}
foreach ($folder in $folders) {
#Get Items that aren't folders
$items = Get-ChildItems $folder.FullName | ? {!($_.PSIsContainer)}
#Get a count - this is easier in PoSh 3
$itemCount = ($items | Measure-Object).Count
if ($itemCount -gt 1){
$items | Sort-Object LastWriteTime -Descending | Select-Object -Last ($itemCount - 1) | Remove-Item
}
}
您可能需要同时运行这两个脚本来修剪根目录,或者在foreach循环之前添加类似于
$folders+=Get Item“C:\test”
的内容,我已经按照建议重新格式化了,抱歉!很抱歉,虽然您的答案在使用一个文件夹时是绝对正确的,但我忽略了这个脚本需要递归运行的事实。我将更新我的原始问题。也许我们需要某种“对于X路径中的每个文件夹”?