0

我正在使用脚本从我们的文件服务器中清除旧文件。我们在脚本中使用这一行来查找早于某个日期的所有文件:

$oldFiles = Get-ChildItem $oldPath -Recurse | Where-Object { $_.lastwritetime -le $oldDate }

我的问题是,如何忽略 $oldPath 中的某个目录?例如,如果我们有以下内容:

    • 目录1
    • 目录 2
      • 子目录 1
      • 子目录 2
    • 目录 3
      • 子目录 1
    • 目录 4

我们想dir 2在构建列表时忽略所有子目录

最终工作脚本:

$oldPath = "\\server\share"
$newDrive = "I:"
$oldDate = Get-Date -Date 1/1/2012

$oldFiles = Get-ChildItem $oldPath -Recurse -File | Where-Object {($_.PSParentPath -notmatch '\\Ignore Directory')  -and $_.lastwritetime -le $oldDate }
$oldDirs = Get-ChildItem $oldPath -Recurse | Where-Object {$_.PSIsContainer -and ($_.PSParentPath -notmatch '\\Ignore Directory')} | select-object FullName
$oldDirs = $oldDirs | select -Unique

foreach ($oldDir in $oldDirs) {
    $strdir = $newDrive + "\" + ($oldDir | Split-Path -NoQualifier | Out-String).trim().trim("\")
    if (!(Test-Path $strdir)) {
        Write-Host "$strdir does not exist. Creating directory..."
        mkdir $strdir | Out-Null
    } # end if
} # end foreach

foreach ($file in $oldFiles) {
    $strfile = $newDrive + "\" + ($file.FullName | Split-Path -NoQualifier | Out-String).trim().trim("\")
    Write-Host "Moving $file.FullName to $strfile..."
    Move-Item $file.FullName -Destination $strfile -Force -WhatIf
} # end foreach

$oldfiles | select pspath | Split-Path -NoQualifier | Out-File "\\nelson\network share\ArchivedFiles.txt"
4

3 回答 3

2

像这样的东西应该工作:

$exclude = Join-Path $oldPath 'dir 2'
$oldFiles = Get-ChildItem $oldPath -Recurse | ? {
  -not $_.PSIsContainer -and
  $_.FullName -notlike "$exclude\*" -and
  $_.LastWriteTime -le $oldDate
}
于 2013-08-19T17:11:43.757 回答
2

将您的 Where-Object 条件修改为:

... | Where-Object {($_.PSParentPath -notmatch '\\dir 2') -and ($_.lastWriteTime -le $oldDate)}

此外,您可能还想过滤掉目录项,以便 $oldFiles 仅包含文件,例如:

$oldFiles = Get-ChildItem $oldPath -Recurse | Where {!$_.PSIsContainer -and ($_.PSParentPath -notmatch '\\dir 2') -and ($_.lastWriteTime -le $oldDate)}

如果您使用的是 PowerShell v3,则可以使用 Get-ChildItem 上的新参数将其简化为:

$oldFiles = Get-ChildItem $oldPath -Recurse -File | Where {($_.PSParentPath -notmatch '\\dir 2') -and ($_.lastWriteTime -le $oldDate)}
于 2013-08-19T17:02:34.183 回答
0

尝试$oldFiles = Get-ChildItem $oldPath -Recurse -Exclude "dir 2" | Where-Object { $_.lastwritetime -le $oldDate}

于 2013-08-19T17:02:38.620 回答