最終アクセス時刻を示す 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
    }
}

関連情報