我正在尝试使用do while循环来删除多个目录中的旧文件(从最旧的目录开始),直到剩下一个,此时程序应该结束。只有在运行时目录中有多个文件时,程序才应运行。
这是我的环境:
在文件夹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
)
}
真诚地感谢您的任何帮助,如果以前已经回答过,我会道歉。我做了很多搜索,但找不到我的情况。
布拉德
答案 0 :(得分:0)
要修复你的问题,你应该在每次通过循环时重新定义$ 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"
之类的内容