Expansión de variables por lotes de DOS para dar la hora del último acceso

Expansión de variables por lotes de DOS para dar la hora del último acceso

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

información relacionada