将“$_.Name”优先于“$_.LastAccessTime”

Prioritizing "$_.Name" over "$_.LastAccessTime"

我创建了一个脚本,允许我从 Remove-Item 语句中搜索和忽略目录,脚本 有效 ,但不一定达到我需要的程度

Get-ChildItem -Path $Path |
  Where-Object {
    ($_.LastAccessTime -lt $Limit) -and
    -not ($_.PSIsContainer -eq $True -and $_.Name -contains ("2013","2014","2015"))
  } | Remove-Item -Force -Recurse -WhatIf

此脚本当前正在查找并删除

的所有对象
  1. 在给定时间段内未访问过

但是我需要这个脚本做的是找到并删除所有对象

  1. 在给定时间段内未访问过 AND
  2. 排除名称为“2013”​​、“2014”或“2015”的目录。

我不是在争论脚本 "isn't working properly",但我的问题的论点是这样的:

如何编写此脚本以首先查看目录名称,然后再查看上次访问日期?我不知道 在哪里以及如何 告诉这个脚本 $_.Name 需要优先于 $_.LastAccessTime -lt $Limit

目前你的条件逻辑是这样的:

Delete objects that were last accessed before $Limit and are not folders whose name contains the array ["2013","2014","2015"].

第二个条件永远不会为真,因为一个字符串永远不能包含一个字符串数组。

此外,最后修改时间存储在LastWriteTime 属性.

你真正想要的是这样的:

Where-Object {
  $_.LastWriteTime -lt $Limit -and
  -not ($_.PSIsContainer -and $_.Name -match '2013|2014|2015')
}

如果目录名称只包含年份而没有其他内容,您也可以使用:

Where-Object {
  $_.LastWriteTime -lt $Limit -and
  -not ($_.PSIsContainer -and '2013','2014','2015' -contains $_.Name)
}

注意最后一个子句的倒序 (array -contains value)。