Рекурсивно изменить свойство DateLastModified папки, чтобы оно соответствовало свойству файла внутри

Рекурсивно изменить свойство DateLastModified папки, чтобы оно соответствовало свойству файла внутри

У меня есть несколько папок, в каждой из которых есть файлы.

Структура выглядит примерно так:

Папка №1
Папка_№_2
Папка № 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, содержащемуся в папке? Есть ли способ сделать это, скопировав файл DateLastModifiedиз папки (дочерней) в родительскую папку с помощью VBScript?

Пока что я работаю над чем-то вроде этого:

Function Recursion(strDirectory)
On Error Resume Next 
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(strDirectory)
Set colFiles = objFolder.Files
Dim objFolderShellItem

For Each objFile in colFiles
If UCase(objFSO.GetExtensionName(objFile)) = "AVI" Then
    Set objShell = CreateObject("Shell.Application")
    Set objShellFolder = objShell.NameSpace(strDirectory)
    Set objFolderItem = objFolder.Self
    'folder
    objFolderItem.ModifyDate = objFile.DateLastModified
    'file
    'objShellFolder.Items.Item(objFile.Name).ModifyDate = objFile.DateLastModified
    Wscript.Echo "Date of folder" & objFolder.Name & "was updated" 
End If
Next

For Each folder In objFolder.SubFolders
    Recursion(folder)  '<- recurse here
Next

Set objFso = Nothing
Set objFolder = Nothing
set colFiles = Nothing

End Function




Call Recursion("C:\Temp")

но при вызове из командной строки с помощью:cscript CopyDateToParent.vbs

Что же мешает этому?

решение1

Если у вас старая система, то вот как бы вы справились с этой проблемой.

Это больше не разрешено из vbs. Вам понадобится скомпилированный язык или возможные права уровня ядра, чтобы сделать это.

Google Powershell на этом сайте, это делается очень легко

Function Recursion(strDirectory)

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(strDirectory)
Set colFiles = objFolder.Files
Dim objFolderShellItem
Dim blnFound



blnFound = false
For Each objFile in colFiles
If UCase(objFSO.GetExtensionName(objFile)) = "AVI" Then
    blnFound = true
    dtDateTime = objFile.DateLastModified
    'if you care only about one file, then you can exit for here for performance, or you have to do more logic on keep thing max date for the avi file or min.  you never said.
    ''file
    ''objShellFolder.Items.Item(objFile.Name).ModifyDate = objFile.DateLastModified
End If
Next

For Each folder In objFolder.SubFolders
    if blnFound = true Then
        Set objShell = CreateObject("Shell.Application")
        Set objShellFolder = objShell.NameSpace(strDirectory)''should be parent folder not 'folder' its in
        Set objFolderItem = objShellFolder.Self
        objFolderItem.ModifyDate = dtDateTime   ''no longer possible since around 2010
    End IF
    Recursion(folder)  '<- recurse here
Next

Set objFso = Nothing
Set objFolder = Nothing
set colFiles = Nothing

End Function




Call Recursion("C:\Temp\")

Извините, у меня нет системы "Microsoft", чтобы вам помочь.

function GetFiles($path = $pwd) 
{ 
    foreach ($item in Get-ChildItem $path)
    {
        if (Test-Path $item.FullName -PathType Container) 
        {
            $item.LastWriteTime = $dateToChange 
            GetFiles $item.FullName
        } 
        else 
        {   
            if($item.extension.ToUpper() -eq 'AVI')
            {
                $dateToChange = $item.LastWritten
            }
        }
    } 
}

Связанный контент