Расширение пакетной переменной DOS для получения времени последнего доступа

Расширение пакетной переменной DOS для получения времени последнего доступа

Я пытаюсь использовать цикл FOR /R для перебора некоторых особенно длинных папок (более 260 символов в длину, отсюда и необходимость использовать \?\ ). Мне нужно из цикла получить полный путь и время последнего доступа.

Если я сделаю это:

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

Я получаю полный путь и время последнего изменения. Даже если я устанавливаю DIRCMD на /TA, похоже, это не влияет на FOR /R. Кто-нибудь знает способ заставить время/дату быть последним доступом, а не последним изменением? AFAIK, длинное имя пути исключает Powershell, что было моим первоначальным подходом, но я буду рад получить предложения и в этом плане.

решение1

Попробуйте обойти это с помощью subst.

Ситуация не слишком проста. Но вы можете объединить: A. Использование dir для получения фактического accdate (он всегда находится в одной и той же позиции). + B. Использование debug для фильтрации этого. + C. Использование subst для временного сокращения пути (обхода ограничения в 255 символов путем его уменьшения).

решение2

Следующее работает (несколько грубо) в 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
    }
}

Связанный контент