DOS批处理变量扩展提供上次访问时间

DOS批处理变量扩展提供上次访问时间

我正在尝试使用 FOR /R 循环来迭代一些特别长名称的文件夹(长度超过 260 个字符,因此需要使用 \?\ ),我需要循环之外的完全限定路径名和最后访问时间

如果我这样做:

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

我得到了完整路径和上次修改时间。即使我将 DIRCMD 设置为 /TA,似乎对 FOR /R 也没有影响。有谁知道强制将时间/日期设置为上次访问而不是上次修改的方法吗?据我所知,长路径名排除了 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
    }
}

相关内容