4

サブフォルダー内で同じ日に複数回ファイルを生成したため、各日付の最初のファイルのみを保持して、最後に生成された 5 つのファイルをディレクトリに保持したいと考えています。

「old」という名前のサブフォルダーを持つ複数のフォルダーがあります

C:\test\folder1\old
C:\test\toto\old
...

たとえば、私のサブフォルダーには次のものがあります。

   Mode                LastWriteTime     Length Name                                                                                                                                                                                                                                                   
----                -------------     ------ ----                                                                                                                                                                                                                                                   

-a---        07/06/2013     12:01  231248950 geofi.ry.7.0.0.159940.zip                                                                                                                                                                                                                             
-a---        07/06/2013     12:33  231248506 geofi.ry.7.0.0.159950.zip                                                                                                                                                                                                                             
-a---        07/06/2013     14:51  231248957 geofi.ry.7.0.0.159962.zip                                                                                                                                                                                                                             
-a---        17/06/2013     19:47  231248860 geofi.ry.7.0.0.160871.zip                                                                                                                                                                                                                             
-a---        18/06/2013     11:03  231248480 geofi.ry.7.0.0.160907.zip
-a---        23/06/2013     07:30  231250266 geofi.ry.7.0.0.161571.zip                                                                                                                                                                                                                                   
-a---        23/06/2013     21:30  231250266 geofi.ry.7.0.0.161563.zip                                                                                                                                                                                                                             
-a---        04/07/2013     00:42  231249910 geofi.ry.7.0.0.162695.zip
-a---        04/07/2013     16:12  231249910 geofi.ry.7.0.0.162647.zip                                                                                                                                                                                                                                  
-a---        08/07/2013     16:10  231250481 geofi.ry.7.0.0.163046.zip                                                                                                                                                                                                                             
-a---        10/07/2013     08:40  231250476 geofi.ry.7.0.0.163378.zip                                                                                                                                                                                                                                                                                                                                                                                                                                                          
-a---        17/07/2013     10:22  231249418 geofi.ry.7.0.0.164001.zip                                                                                                                                                                                                                             

これらのファイルを保持したい:

-a---        17/07/2013     10:22  231249418 geofi.ry.7.0.0.164001.zip
-a---        10/07/2013     08:40  231250476 geofi.ry.7.0.0.163378.zip   
-a---        08/07/2013     16:10  231250481 geofi.ry.7.0.0.163046.zip    
-a---        04/07/2013     00:42  231249910 geofi.ry.7.0.0.162695.zip (on this date i have two files, I want to keep the first generated at this date 00:42).
-a---        23/06/2013     07:30  231250266 geofi.ry.7.0.0.161571.zip (on this date i have two files, I want to keep the first generated at this date 07:30).

これは下書きですが、行き詰まっています。時間を比較するにはどうすればよいですか?

$Days = "5"

$TargetFolder = "C:\test\"

$Extension = "*.zip"

 $Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | sort-object {$_.LastWriteTime} -Descending | ? { $_.fullname -match "old" } | select-object -First 1

 $most_recent_date = $files.LastWriteTime

 $LastWrite = $most_recent_date.Add(-$Days)

 $Files2 = Get-Childitem $TargetFolder -Include $Extension -Recurse | Where {$_.LastWriteTime -le "$LastWrite"}  | ? { $_.fullname -match "old" }


 foreach ($File in $Files2) 
    {
    if ($File -ne $NULL)
        {
        Remove-Item $File.FullName | out-null
        }
    else
        {
        Write-Host "No more files to delete!"
        }
    }

ありがとう

4

4 に答える 4

3

このジョブは、組み込みの連想配列を使用した古き良きバッチの助けを借りて実行することもできます。

@ECHO OFF &SETLOCAL ENABLEDELAYEDEXPANSION
FOR /f "delims=" %%a IN ('dir /a-d /b *.zip') DO (
    FOR /f "tokens=2-4delims=/ " %%b  IN ("%%a") DO SET "filedate=%%d%%c%%b"
    FOR /f "tokens=3" %%b IN ("%%a") DO SET "filetime=%%b"
    SET "$!filedate!$!filetime!=%%a"
)
FOR /f "delims=$" %%a IN ('set "$"') DO (
    IF NOT "%%a"=="!files!" (
        SET "file="
        FOR /f "tokens=2*delims=$=" %%b IN ('set "$%%a"') DO IF NOT DEFINED file SET "file=%%c"
        SET "#%%a=!file!"
        SET "files=%%a"
        SET /a filecount+=1
    )
)
SET /a filecount-=5
FOR /f "skip=%filecount%tokens=2delims==" %%a IN ('set "#"') DO ECHO %%a

セッション プロトコル:

>dir /ad *.zip
-a--- 07/06/2013 12:01 231248950 geofi.ry.7.0.0.159940.zip
-a--- 07/06/2013 12:33 231248506 geofi.ry.7.0.0.159950.zip
-a--- 07/06/2013 14:51 231248957 geofi.ry.7.0.0.159962.zip
-a--- 17/06/2013 19:47 231248860 geofi.ry.7.0.0.160871.zip
-a--- 18/06/2013 11:03 231248480 geofi.ry.7.0.0.160907.zip
-a--- 2013/06/23 07:30 231250266 geofi.ry.7.0.0.161571.zip
-a--- 2013/06/23 21:30 231250266 geofi.ry.7.0.0.161563.zip
-a--- 04/07/2013 00:42 231249910 geofi.ry.7.0.0.162695.zip
-a--- 04/07/2013 16:12 231249910 geofi.ry.7.0.0.162647.zip
-a--- 08/07/2013 16:10 231250481 geofi.ry.7.0.0.163046.zip
-a--- 10/07/2013 08:40 231250476 geofi.ry.7.0.0.163378.zip
-a--- 17/07/2013 10:22 231249418 geofi.ry.7.0.0.164001.zip

>script.bat
-a--- 2013/06/23 07:30 231250266 geofi.ry.7.0.0.161571.zip
-a--- 04/07/2013 00:42 231249910 geofi.ry.7.0.0.162695.zip
-a--- 08/07/2013 16:10 231250481 geofi.ry.7.0.0.163046.zip
-a--- 10/07/2013 08:40 231250476 geofi.ry.7.0.0.163378.zip
-a--- 17/07/2013 10:22 231249418 geofi.ry.7.0.0.164001.zip

于 2013-08-01T23:33:18.493 に答える
2

すべてのフォルダーで最新の 5 つの日付の最新のファイルを保持する場合は、次のようにします。

$TargetFolder = 'C:\test'
$Extension    = '*.zip'

$files = gci $TargetFolder -Include $Extension -Recurse |
    ? { -not $_.PSIsContainer -and $_.Directory.Name -eq 'old' }
$keep = $files | sort LastWriteTime -Desc | group {$_.LastWriteTime.Date} |
    % {$_.Group[-1].FullName} | select -First 5
$totalSize = ($files | ? { $keep -notcontains $_.FullName } |
    Measure-Object -Sum Length).Sum
$files | ? { $keep -notcontains $_.FullName } | Remove-Item -WhatIf

"Deleted size: {0:N3}" -f ($totalSize / 1GB)

各フォルダーから最新の 5 つの日付の最新のファイルを保持する場合は、次のようにしてください。

$TargetFolder = 'C:\test'
$Extension    = '.zip'
$totalSize    = 0

gci $TargetFolder -Recurse | ? { $_.PSIsContainer -and $_.Name -eq 'old' } | % {
  $files = gci $_.FullName | ? { -not $_.PSIsContainer -and
      $_.Extension -eq $Extension }
  $keep = $files | sort LastWriteTime -Desc | group {$_.LastWriteTime.Date} |
      % {$_.Group[-1].FullName} | select -First 5
  $totalSize += ($files | ? { $keep -notcontains $_.FullName } |
      Measure-Object -Sum Length).Sum
  $files | ? { $keep -notcontains $_.FullName } | Remove-Item -WhatIf
}

"Deleted size: {0:N3}" -f ($totalSize / 1GB)

-WhatIf-switch を削除Remove-Itemし、コードが実際に目的の動作をすることを再確認した後、コードを再実行します。

于 2013-07-24T11:26:37.367 に答える
1

あなたの質問から、すべてのサブフォルダーで5つのファイルのみを保持したい場合、以下のコードはあなたが望むことを行うと思います. サブフォルダーごとに 5 つのファイルを保持する場合は、最初にそれらのフォルダーの外部ループを作成してから、個々のフォルダーごとに以下のコードを実行します。

$TargetFolder = "C:\test\"

$AllFiles = Get-Childitem $TargetFolder -Filter *.zip -Recurse | 
  ? { $_.fullname -match "old" -and -not $_.PSIsContainer  }

$KeepFiles = $AllFiles | 
  Sort-Object LastWriteTime | 
  Group-Object {$_.LastWriteTime.Date} | 
  % {$_.Group[0]} | 
  Sort-Object LastWriteTime -Descending |
  Select-Object -First 5

Compare-Object -ReferenceObject $AllFiles -DifferenceObject $KeepFiles -PassThru |
  Remove-Item
于 2013-07-24T10:48:08.087 に答える