Estou tentando usar um loop FOR /R para iterar em algumas pastas com nomes particularmente longos (maiores que 260 caracteres de comprimento, daí a necessidade de usar \?\ ). Preciso sair do loop, o nome do caminho totalmente qualificado e o último horário de acesso
Se eu fizer isso:
for /r "\\?\c:\windows" %a in (*.bat) do echo %~fta
Recebo o caminho completo e a hora da última modificação. Mesmo se eu definir DIRCMD como /TA, parece não haver nenhum efeito no FOR /R Alguém sabe uma maneira de forçar a hora/data a ser acessada pela última vez em vez de modificada pela última vez? AFAIK, o nome longo exclui Powershell, que foi minha abordagem original, mas fico feliz em receber sugestões sobre isso também.
Responder1
Tente contornar isso usando subst.
A situação não é muito simples. Mas você pode combinar: A. Usar dir para obter a data real (é sempre na mesma posição). + B. Usando debug para filtrar isso. + C. Usando subst para encurtar o caminho temporário (ignorar o limite de 255 caracteres diminuindo-o).
Responder2
O seguinte funciona (de forma um tanto grosseira) no 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
}
}