DOS批处理变量扩展以提供最后访问时间


0

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

如果我这样做:

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

我得到了完整的路径和最后修改的时间。即使我将DIRCMD设置为/ TA,似乎对FOR / R也没有影响。有人知道强制该时间/日期最后访问而不是最后修改的方法吗?AFAIK,长路径名称排除了Powershell,这是我最初的方法,但也很高兴收到建议。



谢谢,如果这允许我将\\?\用作长路径名,则可能是解决方案。
Dave_J 2015年

您是否已在资源管理器中签到最近访问时间正在更新?如果不是,则需要单击此链接
AFH 2015年

似乎此命令:for /f "delims=" %%F in ('dir /o:d /t:a /s /b "c:\myPath\*"') @echo %%~tF %%F不会输出与仅执行dir / t:a相同的日期,因此很遗憾回到平方1。@AFH是的,时间戳在那儿,只是在努力争取。
Dave_J 2015年

为什么不在dir循环中使用,然后使用诸如grepsed或之类的过滤器cut提取所需的时间戳?这些是Unix实用程序,已多次移植到Windows,包括在MS自己的Unix服务中。
AFH 2015年

Answers:


0

尝试通过使用替代解决此问题。

情况不是太简单。但是您可以组合:A.使用dir获取实际的accdate(它总是在同一位置)。+ B.使用debug进行过滤。+ C.使用替代临时路径(通过降低255个字符的限制)。


这是一个很好的建议,但是网络共享从一条短路径开始,然后分叉成多个,总长度大于260。在路径名称接近时,我必须找到一种方法来编写SUBSTing脚本。可以,但是我敢肯定,不过是PITA
Dave_J 2015年

0

以下在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
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.