Ändern Sie rekursiv die DateLastModified-Eigenschaft des Ordners, damit sie mit der der darin enthaltenen Datei übereinstimmt.

Ändern Sie rekursiv die DateLastModified-Eigenschaft des Ordners, damit sie mit der der darin enthaltenen Datei übereinstimmt.

Ich habe mehrere Ordner, jeder mit Dateien darin.

Die Struktur sieht ungefähr so ​​aus:

Ordner Nr.1
Ordner_Nr._2
Ordner Nr. 3

und die darin enthaltenen Dateien sehen ungefähr so ​​aus:

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

Wie Sie sehen, enthalten einige Ordnernamen „+“ und .einige „+“ _und einige „+“ Leerzeichen.

Der einzige konstante Faktor ist, dass jeder Ordnerstetsenthalten eine AVI-Datei, unabhängig von allem anderen.

Wie kann ich also Date ModifiedDatum und Uhrzeit des Ordners so ändern, dass sie mit denen der im Ordner enthaltenen AVI-Datei übereinstimmen? Gibt es eine Möglichkeit, dies zu tun, indem ich die DateLastModifiedDatei im Ordner (dem untergeordneten Ordner) mit VBScript in den übergeordneten Ordner kopiere?

Bisher arbeite ich an so etwas:

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")

Der Aufruf von der Befehlszeile aus schlägt jedoch fehl mit:cscript CopyDateToParent.vbs

Was führt dazu, dass dies nicht funktioniert?

Antwort1

Wenn Sie ein älteres System verwenden, hätten Sie es folgendermaßen gehandhabt.

Dies ist von VBS aus nicht mehr zulässig. Sie benötigen hierfür eine kompilierte Sprache oder möglicherweise Berechtigungen auf Kernelebene.

Google Powershell auf dieser Site, es ist sehr einfach

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\")

Leider habe ich kein "Microsoft"-System, das Ihnen helfen könnte

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
            }
        }
    } 
}

verwandte Informationen