基于basename的x号字符对项目进行分组

时间:2015-06-09 08:54:18

标签: powershell directory

我帮助设置了一个聪明的脚本,它根据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真的很陌生,我不确定上述方法是否正确。

1 个答案:

答案 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))