web-dev-qa-db-ja.com

ファイルの最新のリビジョンをすべて削除します

だから私は私が仕事のために行った巨大なリストを持っています、そして私はそれらを1つのフォルダにまとめることができて、古いRevsのすべてを削除してそこに最も高いRevを残すバッチを実行することができるようにしたいです。私はこれがいくつかの深刻な深いプログラミングなしに可能なことさえないので、私はここで尋ねると思いました。

ファイル名の例:

  • 01-XY-001-REV-0_1-6-2014.pdf.
  • 01-XY-001-REV-2_1-13-2014.pdf.
  • 01-XY-001-REV-9_2-1-2014.pdf.
  • 01-XY-001-REV-11_2-4-2014.pdf.
  • 01-XY-002-REV-0_1-7-2014.pdf.
  • 01-XY-002-REV-4_1-13-2014.pdf.
  • 01-XY-002-REV-7_1-26-2014.pdf.
  • 01-XY-002-REV-11_2-4-2014.pdf.
  • 01-XXX-001-REV-0_1-13-2014.pdf.
  • 01-XXX-001-REV-4_1-21-2014.pdf.
  • 01-XXX-001-REV-6_2-1-2014.pdf.
  • 01-XXX-001-REV-10_2-4-2014.pdf.

最後に、私はそれがあなたのように見えたいです。

  • 01-XY-001-REV-11_2-4-2014.pdf.
  • 01-XY-002-REV-11_2-4-2014.pdf.
  • 01-XXX-001-REV-10_2-4-2014.pdf.

それ以来、そうです。これは可能です、名前が異なるこれらのファイルが何百ものあり続けることを留めますか?一貫した唯一のものは、REV-1、REV-2、REV-3などです。ここでは、図面に基づいて上記のように変化します。私は本当にこれをできるだけ見ていませんが、私はとにかく尋ねても構わないと思っています。

1
Helzehen

私たちはスクリプトライティングサービスではありませんが、私はある時間と興味を持っていました。

#Set directory to search (. = current directory).
$dir = "."

#Get a list of all the files (only), sorted with newest on top.
$dirFiles = Get-ChildItem -Path $dir | where { ! $_.PSIsContainer } | Sort-Object LastAccessTime -Descending

#Create an array to hold unique file name parts.
$uniqueFileNameParts = @()

#Create an array to hold final file list of files to keep.
$filesToKeep = @()

#Add the file name of the script itself to the files to keep, to prevent it from being deleted if it's in the same folder you're trying to clean.
$filesToKeep += $MyInvocation.MyCommand.Name

#Loop through all the files in the directory list.
foreach ($file in $dirFiles) {
    #If it contains "-Rev-" pull the first part of the file name (up to and including "-Rev-").
    $filenameTokenLocation = $file.name.IndexOf("-Rev-")
    if ($filenameTokenLocation -ge 0) {
        $endOfString = $filenameTokenLocation + 5
        $subString = $file.name.Substring(0,$endOfString)

        #If the file name part doesn't already exist in the array, add it to it.
        if ($uniqueFileNameParts -notcontains $subString) {
            $uniqueFileNameParts += $subString
        } 
    }
}

#Loop through all the file name parts.
foreach ($fileName in $uniqueFileNameParts) {
    #Create a list of all files starting with that file name part, select the one file with the newest "LastWriteTime" attribute, and assign it to $latest.
    $latest = Get-ChildItem -Path $dir | where { ! $_.PSIsContainer } | where {  $_.name.StartsWith($fileName) } | Sort-Object LastAccessTime -Descending | Select-Object -First 1
    #Add that file to the list of files to keep.
    $filesToKeep += $latest.name
}

#Get all files in the folder that are not in the list of files to keep, and remove them.
Get-ChildItem -exclude ($filesToKeep) | where { ! $_.PSIsContainer } | Remove-Item

ノート:

  • これはファイルの最後の書き込み時間を使用して、ファイル名自体の時間/日付スタンプが考慮されていないかを判断する。
  • 大文字と小文字が区別されているため、XYZ.txtという名前のファイルは必ずしもxYz.TxTという名前のものと同じではありません。
  • それは再帰的ではない、それはそれを目的とするフォルダ/ディレクトリのみをチェックし、サブフォルダを無視します。
  • それはすべての登場ほど危険ですので、それを試す前にフォルダのバックアップをしてください。 :)

それが助けてくれることを願っています!

1