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. 使用偵錯來過濾它。 + 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
    }
}

相關內容