0

サブフォルダー構造を維持しながら、ソースディレクトリから宛先ディレクトリにファイルタイプごとに5つの最新ファイルを移動するPSスクリプトに取り組んでいます。たとえば、AB_ で始まるファイルを、ParentFolder1\FolderA、ParentFolder1\FolderB、ParentFolder1\FolderC などから、ParentFolder2\FolderA、ParentFolder2\FolderB、ParentFolder2\FolderC に移動したいと考えています。

親フォルダー1

--FolderA

----AB_1234.txt

----AB_5678.txt

----XY_9876.txt

----XY_9876.txt

--FolderB

----AB_1234.txt

----AB_5678.txt

----XY_9876.txt

----XY_9876.txt

--FolderC

----AB_1234.txt

----AB_5678.txt

----XY_9876.txt

----XY_9876.txt

これを for ループに結び付ける方法はありますか? これが私がこれまでに持っているものです:

$source = "C:\Test"
$dest = "E:\archive"
$AB = Get-ChildItem -Path $source -include AB_* -Recurse | Where-Object {-not $_.PsIsContainer}
$XY = Get-ChildItem -Path $source -include XY_* -Recurse | Where-Object {-not $_.PsIsContainer}
$keep = 5
$logfile = "E:\_archive\temp\log_{0:MM-dd-yyyy}.log" -f (Get-Date)

if ($AB.Count -gt $keep) {
    $AB | Sort -property LastWriteTime | Select-Object -First ($AB.Count - $keep) | Move-Item -destination $dest\AB -Force -Verbose
    }
Else
    {"No AB_ files to archive." | Out-File $LogFile -Append -Force}

if ($XY.Count -gt $keep) {
    $XY | Sort -property LastWriteTime | Select-Object -First ($XY.Count - $keep) | Move-Item -destination $dest\XY -Force -Verbose
    }
Else
    {"No XY_ files to archive." | Out-File $LogFile -Append -Force}
4

2 に答える 2

2
function Move-Newest-Files 
{
    param (
        [parameter(Mandatory = $true)] [string] $source,
        [parameter(Mandatory = $true)] [string] $destination,
        [parameter(Mandatory = $true)] [array] $filter,
        [parameter(Mandatory = $false)][int] $keep = 5
    )

    try
    {
        $source = Resolve-Path $source

        $list = Get-ChildItem -Path $source -Include $filter -Recurse -Force |
            Where-Object { -not $_.psIsContainer } |
            Sort-Object -property LastWriteTime -descending | 
            Select-Object -First $keep

        foreach ($file in $list)
        {
            $destfile = $file -replace [regex]::Escape($source), $destination
            $destpath = Split-Path $destfile -Parent

            if (!(Test-Path $destpath))
                { $null = New-Item -ItemType Container -Path $destpath }

            Move-Item $file -Force -Destination $destfile
        }
    }

    catch
    {
        Write-Host "$($MyInvocation.InvocationName): $_"
    }
}

Move-Newest-Files . "D:\xyzzy" @("*.cs", "*.txt", "*.exe") 10
于 2012-07-20T06:33:44.477 に答える
0

Robocopyを使用したほうがよい場合があります。

于 2012-07-19T23:23:32.670 に答える