我帮助设置了一个聪明的脚本,它根据basename和LastWriteTime对文件夹中的项目进行分组,它允许我删除除给定文件数量(即5个版本)之外的所有内容。现在我想将基本名称分组限制为8个字符。
gci C:\test\ |
where{-not $_.PsIsContainer} |
$file = basename
Group-Object $file.substring(8) |
foreach {
$_.Group |
sort LastWriteTime -Descending |
Select -Skip 5 |
foreach { Remove-Item $_.fullname -Force -WhatIf }
}
由于我对PowerShell真的很陌生,我不确定上述方法是否正确。
答案 0 :(得分:3)
如果您想按前8个字符分组,则需要Substring(0, 8)
。 Substring(8)
将生成从第9个字符到字符串结尾的子字符串。此外,如果要按当前对象的属性进行分组,请在脚本块中定义它们。
改变这个:
gci C:\test\ |
where{-not $_.PsIsContainer} |
$file = basename
Group-Object $file.substring(8) | ...
进入这个:
Get-ChildItem 'C:\test' |
Where-Object {-not $_.PSIsContainer} |
Group-Object { $_.Basename.Substring(0,8) } | ...
请注意,如果basename短于8个字符,Substring(0,8)
将抛出错误。例如,可以通过将长度定义为最小值8和字符串长度来避免这种情况:
$_.Basename.Substring(0, [Math]::Min(8, $_.Basename.Length))