【问题标题】:Recursively change Date Modified property of Folder to match that of file inside [closed]递归更改文件夹的日期修改属性以匹配内部文件的属性[关闭]
【发布时间】:2019-11-09 10:19:04
【问题描述】:

我有很多文件夹,每个文件夹里面都有文件。

结构看起来像这样:

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 文件的日期/时间?

有什么方法可以使用批处理文件来做到这一点吗?

感谢您的帮助!

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

【问题讨论】:

    标签: regex powershell batch-file cmd


    【解决方案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"
    

    【讨论】:

    • 我已经修改了目录信息的获取方式。请重试。
    • Select-Object 确保只使用一 (1) 个 .avi 文件。我不认为Get-Member 在那里会有用。正在使用哪个版本的 PowerShell?命令powershell -NoLogo -NoProfile -Command "$PSVersionTable.PSVersion.ToString()" 的输出是什么?
    • 这是一个半有趣的问题。看起来虽然目录是管道内的一个对象,但它无法更改。代码现在将要更改的目录和 .avi 文件中的时间戳保存到哈希中。最后一行实际更改了目录 LastWriteTime。
    • 您是否尝试过答案中的当前代码? PS 3 将需要一些更改。它适用于我运行 PS 5.1 的 Windows 7 系统。
    • 再次修改代码以在 PS 3 上运行。我已经对此进行了测试,它可以在我的机器上运行。 Windows 7,PS 5.1。
    猜你喜欢
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2010-09-24
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    相关资源
    最近更新 更多