PowerShell - Get-ChildItem - 忽略特定目录

时间:2013-08-19 16:47:07

标签: powershell

我正在使用脚本清除文件服务器上的旧文件。我们在脚本中使用此行来查找早于特定日期的所有文件:

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

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

    • DIR1
    • 目录2
      • subdir 1
      • subdir 2
    • 目录3
      • subdir 1
    • dir 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"

3 个答案:

答案 0 :(得分: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)}

答案 1 :(得分:2)

这样的事情应该有效:

$exclude = Join-Path $oldPath 'dir 2'
$oldFiles = Get-ChildItem $oldPath -Recurse | ? {
  -not $_.PSIsContainer -and
  $_.FullName -notlike "$exclude\*" -and
  $_.LastWriteTime -le $oldDate
}

答案 2 :(得分:0)

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