0

ファイル サーバーから古いファイルを消去するスクリプトを使用しています。スクリプトで次の行を使用して、特定の日付より古いすべてのファイルを検索します。

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

私の質問は、$oldPath 内の特定のディレクトリを無視するにはどうすればよいですか? たとえば、次のような場合:

    • dir1
    • 方向 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 に答える