DOS-Batchvariablenerweiterung zur Angabe der letzten Zugriffszeit

DOS-Batchvariablenerweiterung zur Angabe der letzten Zugriffszeit

Ich versuche, eine FOR /R-Schleife zu verwenden, um über einige Ordner mit besonders langen Namen zu iterieren (mehr als 260 Zeichen lang, daher muss \?\ verwendet werden). Ich brauche aus der Schleife den vollqualifizierten Pfadnamen und die letzte Zugriffszeit

Wenn ich dies mache:

for /r "\\?\c:\windows" %a in (*.bat) do echo %~fta

Ich erhalte den vollständigen Pfad und die letzte Änderungszeit. Selbst wenn ich DIRCMD auf /TA setze, scheint es keine Auswirkungen auf FOR /R zu geben. Kennt jemand eine Möglichkeit, diese Zeit/das Datum als letzten Zugriff und nicht als letzte Änderung festzulegen? Soweit ich weiß, schließt der lange Pfadname Powershell aus, was mein ursprünglicher Ansatz war, aber ich freue mich auch über Vorschläge dazu.

Antwort1

Versuchen Sie, dies durch die Verwendung von subst zu umgehen.

Die Situation ist nicht ganz einfach. Aber Sie können kombinieren: A. Verwenden Sie dir, um das aktuelle Zugriffsdatum zu erhalten (es ist immer an derselben Position). + B. Verwenden Sie debug, um es zu filtern. + C. Verwenden Sie subst, um den Pfad vorübergehend zu verkürzen (umgehen Sie das Limit von 255 Zeichen, indem Sie es verringern).

Antwort2

Folgendes funktioniert (etwas grob) in 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
    }
}

verwandte Informationen