마지막 액세스 시간을 제공하기 위한 DOS 배치 변수 확장

마지막 액세스 시간을 제공하기 위한 DOS 배치 변수 확장

FOR /R 루프를 사용하여 특히 긴 이름의 폴더(길이가 260자를 초과하므로 \?\를 사용해야 함)를 반복하려고 합니다. 루프에서 정규화된 경로 이름과 마지막 접속 시간

내가 이렇게 하면:

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

전체 경로와 마지막 수정 시간을 얻습니다. DIRCMD를 /TA로 설정해도 FOR /R에는 아무런 영향이 없는 것 같습니다. 해당 시간/날짜를 마지막으로 수정하지 않고 마지막으로 액세스하도록 강제하는 방법을 아는 사람이 있습니까? 긴 경로 이름인 AFAIK는 Powershell을 배제합니다. Powershell은 저의 원래 접근 방식이었지만 이에 대한 제안도 받게 되어 기쁘게 생각합니다.

답변1

subst를 사용하여 이 문제를 해결해 보세요.

상황은 그리 간단하지 않습니다. 그러나 다음을 결합할 수 있습니다. A. dir을 사용하여 실제 accdate를 얻습니다(항상 동일한 위치에 있음). + B. 디버그를 사용하여 필터링합니다. + 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
    }
}

관련 정보