
Tengo varias carpetas, cada una con archivos dentro de la carpeta.
La estructura se parece a esto:
Carpeta.No.1 Carpeta_No_2 Carpeta número 3
y los archivos que contiene son algo como:
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
Como puede ver, algunas carpetas contienen .
el nombre, otras contienen espacios _
y otras contienen espacios.
El único factor consistente es que cada carpetasiemprecontener un archivo .avi, independientemente de cualquier otra cosa.
Por lo tanto, ¿cómo puedo cambiar la Date Modified
fecha/hora de la carpeta para que coincida con la del archivo .avi contenido en la carpeta? ¿Hay alguna manera de hacer esto copiando el DateLastModified
archivo interno (el secundario) a la carpeta principal usando VBScript?
Hasta ahora estoy trabajando en algo como esto:
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")
pero falla al llamar desde la línea de comando con:cscript CopyDateToParent.vbs
¿Qué es lo que hace que esto no funcione?
Respuesta1
Si tiene un sistema antiguo, así es como lo habría manejado.
Ya no está permitido desde vbs. Necesitará un lenguaje compilado o posibles privilegios a nivel de kernel para hacerlo.
Google PowerShell en este sitio, se hace muy fácilmente.
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\")
Lo siento, no tengo ningún sistema "Microsoft" para ayudarte.
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
}
}
}
}