递归更改Folder的Date Modified属性以匹配其中的文件

时间:2019-06-27 11:44:26

标签: regex powershell batch-file cmd

我有许多文件夹,每个文件夹中都有文件。

结构看起来像这样:

Folder.No.1
Folder_No_2
Folder No 3

和其中的文件类似:

Folder.No.1\My.Movie.1.avi
Folder.No.1\My.Movie.1.txt

Folder_No_2\My_Movie_2.avi
Folder_No_2\My_Movie_2.jpg
Folder_No_2\My_Movie_2.txt

Folder No 3\My Movie 3.avi

如您所见,某些文件夹包含。在名称中,有些包含_,有些包含空格。

一个一致的因素是,每个文件夹都会始终包含.avi文件,而不管其他任何内容。

因此,如何更改文件夹的Date Modified日期/时间以使其与文件夹中包含的.avi文件的日期/时间匹配?

是否可以使用批处理文件执行此操作?

感谢您的帮助!

如果这个问题已经有了答案(使用命令行批处理脚本),请指导我,因为我已经看过很多答案,但是找不到确切的答案。

1 个答案:

答案 0 :(得分:1)

这很容易完成,方法是遍历“ Folder *”目录,标识“ .avi”文件,并将目录LastWriteTime设置为“ .avi”文件的目录。我尚未对此进行测试,但这应该提供一个很好的起点。

=== Set-FolderToAviTime.ps1

[CmdletBinding()]
Param()
$BaseDir = 'C:\src\t\redatedirs'    # Directory containing 'Folder*' directories
$DirMask = 'Folder*'                # 'Folder*'
$DirHash = @{}
Get-ChildItem -Path $BaseDir -Filter $DirMask |
    Where-Object { $_.PSIsContainer } |
    ForEach-Object {
        Write-Verbose "Working on directory $($_.FullName)"
        $Dir = Get-Item -Path $_.FullName
        if (-not (Test-Path -Path "$_\*" -Filter '*.avi')) {
            Write-Verbose -Message "No .avi file in $($Dir.fullname)"
        }
        Get-ChildItem -Path "$_\*" -Filter '*.avi' |
            Where-Object { -not $_.PSIsContainer } |
            Select-Object -First 1 |
            ForEach-Object {
                Write-Verbose "Using .avi file $($_.FullName)"
                $DirHash[$Dir] = $_.LastWriteTime
            }
    }
$DirHash.Keys | ForEach-Object { $_.LastWriteTime = $DirHash[$_] }

=== Set-FolderToAviTime.bat

powershell -NoLogo -NoProfile -Command ".\redatedirs.ps1 -Verbose"