DOS-Batch-Variablenerweiterung zur Angabe der letzten Zugriffszeit

0

Ich versuche, mit einer FOR / R-Schleife einige Ordner mit besonders langen Namen zu durchlaufen (die länger als 260 Zeichen sind, daher muss \? \ Verwendet werden). Ich brauche aus der Schleife den vollqualifizierten Pfadnamen und die letzte Zugriffszeit

Wenn ich das mache:

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

Ich erhalte den vollständigen Pfad und die letzte geänderte Zeit. Selbst wenn ich DIRCMD auf / TA setze, scheint es keine Auswirkungen auf FOR / R zu geben Kennt jemand eine Möglichkeit, um zu erzwingen, dass auf diese Zeit / dieses Datum zuletzt zugegriffen wird, anstatt sie zuletzt zu ändern? AFAIK, der lange Pfadname, schließt Powershell aus, was mein ursprünglicher Ansatz war, aber ich freue mich auch darüber, Vorschläge zu erhalten.

Dave_J
quelle
Danke, wenn dies mir erlaubt, das \\? \ Für lange Pfadnamen zu verwenden, könnte dies die Lösung sein.
Dave_J
Haben Sie im Explorer überprüft, dass die letzten Zugriffszeiten aktualisiert werden? Wenn nicht, müssen Sie folgen dieser Link .
AFH
Es scheint, dass dieser Befehl: for /f "delims=" %%F in ('dir /o:d /t:a /s /b "c:\myPath\*"') @echo %%~tF %%F Gibt nicht dasselbe Datum aus wie nur dir / t: a also zurück zu Feld 1, leider. @AFH ja, die Zeitstempel sind da und kämpfen nur darum, an sie heranzukommen.
Dave_J
Warum nicht benutzen dir Verwenden Sie in Ihrer Schleife dann Filter wie grep und sed oder cut die Zeitstempel zu extrahieren, die Sie benötigen? Hierbei handelt es sich um Unix-Dienstprogramme, die mehrfach auf Windows portiert wurden, einschließlich der MS-eigenen Dienste für Unix.
AFH

Antworten:

0

Versuchen Sie, dies mit subst zu umgehen.

Die Situation ist nicht zu einfach. Aber Sie können kombinieren: A. Verwenden Sie dir, um das aktuelle Datum abzurufen (es befindet sich immer an derselben Position). + B. Verwenden von Debug, um dies zu filtern. + C. Verwenden von subst, um den Pfad vorübergehend zu verkürzen (Begrenzung auf 255 Zeichen durch Verringern umgehen).

Overmind
quelle
Es ist ein guter Vorschlag, aber die Netzwerkfreigabe beginnt auf einem kurzen Pfad und teilt sich dann in ein Vielfaches auf, wobei die Gesamtlänge größer als 260 ist. Ich müsste einen Weg finden, um SUBSTing zu skripten, wenn der Pfadname knapp wird. Machbar, da bin ich mir sicher, aber ein PITA
Dave_J
0

Die folgenden Arbeiten (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
    }
}
Dave_J
quelle