Estoy tratando de usar un bucle FOR /R para iterar sobre algunas carpetas con nombres particularmente largos (más de 260 caracteres de longitud, de ahí la necesidad de usar \?\ ). Necesito fuera del bucle, el nombre de ruta completo y la última hora de acceso
Si hago esto:
for /r "\\?\c:\windows" %a in (*.bat) do echo %~fta
Obtengo la ruta completa y la hora de la última modificación. Incluso si configuro DIRCMD en /TA, parece que no hay ningún efecto en FOR /R. ¿Alguien sabe una manera de forzar que se acceda por última vez a esa hora/fecha en lugar de modificarla por última vez? AFAIK, el nombre de la ruta larga descarta Powershell, que era mi enfoque original, pero también me complace recibir sugerencias al respecto.
Respuesta1
Intente solucionar este problema utilizando subst.
La situación no es demasiado sencilla. Pero puede combinar: A. Usar dir para obtener la fecha de acceso real (siempre está en la misma posición). + B. Usar depuración para filtrar eso. + C. Usar subst para acortar temporalmente la ruta (evite el límite de 255 caracteres bajándolo).
Respuesta2
Lo siguiente funciona (un poco toscamente) en Powershell
[CmdLetBinding()]
Param(
[string]$Path,
[string]$extension = "*"
)
If ($Path.ToString().Substring($Path.Length-1,1) -eq "\")
{
$Path = $Path.ToString().Substring(0,$Path.Length -1)
}
If ($Extension[0] -eq ".")
{
$Extension = $Extension[1..$Extension.Length] -join ""
}
$dirlisting = cmd /c "dir \\?\$path\*.$extension /s /-c /t:a"
ForEach ($line in $dirlisting)
{
if ($line -match "^ Directory of (.*)$")
{
$FolderName = $matches[1] -replace "\\\\\?\\",""
} ElseIf ($line -match "(\d{2}/\d{2}/\d{4})\s+?(\d{2}:\d{2})\s+?(\d+?)\s+?(.+)$")
{
$DateAndTime = [datetime]::Parse($matches[1] + " " + $matches[2])
$Filesize = $matches[3]
$FileName = Join-Path -Path $FolderName -ChildPath $matches[4]
$FileObject = New-Object PSCustomObject -Property @{
FullPath=$FileName
LastAccessTime=$DateAndTime
FileSize=$FileSize
}
Write-Output $FileObject
}
}