ホーム>source

私はこのようなフォルダ構造を持っています

-2018
--01-Jan
--02-Feb
--etc
-2017
--01-Jan
--02-Feb
--etc

7歳以上のすべてのディレクトリを削除する方法はありますか?(この命名構造に従って...作成/変更日などによらない)

したがって、2018年8月に実行した場合、

-2018
-2017
-2016
-2015
-2014
-2013
-2012
-2011
--08-Aug
--09-Sep
--10-Oct
--11-Nov
--12-Dec

したがって、2012〜2018のフォルダは変更されません。 2010以前のフォルダーはすべて削除されます。 また、2011年7月7日以下のフォルダはすべて削除されます。

ありがとう P

あなたの答え
  • 解決した方法 # 1

    さて、これは非常に簡単で、基本的にいくつかのコーディングとネストされたループの使用が必要になります。理解する必要があるのは、Get-Date動詞の使用方法です。したがって、2011年以前にすべてのデータを再帰的に削除するサンプルは次のようになります。

    # Set your Path
    $MyFolderPath = "C:\MyPath"
    # Define the object to hold the folders (We are only looking for Folders not files)
    $folders = Get-Childitem -Path $MyFolderPath -Directory
    # Loop through each folder
    foreach($folder in $folders)
    {
        # Using a cast to integer compare the Year using the folder name with the 
        # Get-Date function -7 years from this year
        if([int]$folder.Name -lt (Get-Date).AddYears(-7).Year)
        {
            # Now remove the entire folder recursively without prompting.
            Remove-Item $folder.FullName -Recurse -Force -Confirm:$false
        }    
    }
    
    

    今月のレベルにそれを達成するために。ネストされたループをいじって、そのレベルに到達できるようにします。これがお役に立てば幸いです...

  • 解決した方法 # 2

    最初に、このコードを使用して同等のフォルダー構造を作成しました。

    ##
    ## define enum for months
    ##
    enum month {
      Jan = 1
      Feb = 2
      Mar = 3
      Apr = 4
      May = 5
      Jun = 6
      Jul = 7
      Aug = 8
      Sep = 9
      Oct = 10
      Nov = 11
      Dec = 12
    }
    ##
    ## create folder structure
    ##
    New-Item -Path c:\ -Name Testdata -ItemType Directory
    2018..2005 |
    foreach {
      New-Item -Path c:\Testdata -Name $psitem -ItemType Directory
      $path = "c:\Testdata\$psitem"
      1..12 | 
      foreach {
        $name =  "{0:00}-{1}" -f $psitem, [month]$psitem
        New-Item -Path $path -Name $name -ItemType Directory
      }
    }
    
    

    これにより、テストしやすい構造が得られます。あなたの年のフォルダは何かのサブフォルダであると仮定しています。同様に機能するドライブのルートにある場合。

    フォルダーを削除するには:

    enum month {
      Jan = 1
      Feb = 2
      Mar = 3
      Apr = 4
      May = 5
      Jun = 6
      Jul = 7
      Aug = 8
      Sep = 9
      Oct = 10
      Nov = 11
      Dec = 12
    }
    $date = Get-Date
    $year = $date.Year - 8
    ##
    ##  delete evreything 8 years or older
    ##
    Get-ChildItem -Path C:\Testdata -Directory |
    where Name -le $year |
    foreach {
      Remove-Item -Path $psitem.Fullname -Recurse -Force -Confirm:$false
    }
    ##
    ##  if Month -ne January
    ##   need to delete some months
    ##
    if ($date.Month -gt 1){
      $path = "C:\testdata\$($year+1)"
      $month = $date.Month -1
      1..$month | 
      foreach {
        $mpath = "$path\{0:00}-{1}" -f $psitem, [month]$psitem
        Remove-Item -Path $mpath -Recurse -Force -Confirm:$false
      }
    }
    
    

    使用する3文字の略語について仮定していますが、enumは簡単に変更できます。

    コードは現在の日付を取得し、年から8を引いた値を取得します。トップレベルフォルダーをループし、定義した年以下のフォルダーを取得します。それらとその内容は強制的に削除されます。削除を停止できるのは、開いているファイルのいずれかを固定している場合だけです。

    現在の月が1月であれば、他に何もする必要はありません。それ以外の場合は、-7年フォルダーへのパスを作成し、削除する最後の月を計算します。月をループし、パスを作成し、フォルダーとその内容を強制的に削除します。

    作業の大部分は年レベルで行われ、数か月のクイッククリーンアップが行われます。ロジックが必要なものであるかを確認するために、数ヶ月間テストすることをお勧めします。

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ python - 正規表現に条件を追加するにはどうすればよいですか?