根据基本名称的 x 个字符对项目进行分组
Group items based on x number characters of 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 的新手,我不确定以上方法是否正确。
如果要按前 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) } | ...
请注意,如果基本名称少于 8 个字符,Substring(0,8)
将引发错误。您可以通过将长度定义为 8 和字符串长度中的最小值来避免这种情况:
$_.Basename.Substring(0, [Math]::Min(8, $_.Basename.Length))
我得到了帮助来设置一个聪明的脚本,该脚本根据基本名称和 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 的新手,我不确定以上方法是否正确。
如果要按前 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) } | ...
请注意,如果基本名称少于 8 个字符,Substring(0,8)
将引发错误。您可以通过将长度定义为 8 和字符串长度中的最小值来避免这种情况:
$_.Basename.Substring(0, [Math]::Min(8, $_.Basename.Length))