rutas - ¿Cómo puedo encontrar archivos con una longitud de ruta de más de 260 caracteres en Windows?
eliminar limite de caracteres windows 7 (8)
Como refinamiento de la solución más simple, y si no puede o no quiere instalar Powershell, simplemente ejecute:
dir /s /b | sort /r /+261 > out.txt
o (más rápido):
dir /s /b | sort /r /+261 /o out.txt
Y las líneas de más de 260 llegarán a la parte superior de la lista. Tenga en cuenta que debe agregar 1 al parámetro de columna SORT (/ + n).
Estoy usando una copia en un script de Windows XP para copiar recursivamente un directorio. Sigo recibiendo un error de ''Memoria Insuficiente'', lo cual entiendo es porque un archivo que intento copiar tiene una ruta demasiado larga. Puedo reducir fácilmente la longitud de la ruta, pero desafortunadamente no puedo determinar qué archivos están violando la restricción de longitud de la ruta. Los archivos que se copian se imprimen en la salida estándar (que estoy redireccionando a un archivo de registro), pero el mensaje de error se imprime en la terminal, por lo que ni siquiera puedo calcular aproximadamente en qué directorio se está dando el error. .
De http://www.powershellmagazine.com/2012/07/24/jaap-brassers-favorite-powershell-tips-and-tricks/ :
Get-ChildItem –Force –Recurse –ErrorAction SilentlyContinue –ErrorVariable AccessDenied
la primera parte simplemente itera a través de esta y subcarpetas; el uso de -ErrorVariable AccessDenied
significa insertar los elementos ofensivos en la variable AccessDenied
.
A continuación, puede escanear la variable como tal
$AccessDenied |
Where-Object { $_.Exception -match "must be less than 260 characters" } |
ForEach-Object { $_.TargetObject }
Si no le importan estos archivos (puede ser aplicable en algunos casos), simplemente suelte la parte -ErrorVariable AccessDenied
.
He hecho una alternativa a las otras buenas respuestas aquí que usan PowerShell, pero la mía también guarda la lista en un archivo. Lo compartiré aquí en caso de que alguien más necesite algo así.
Advertencia: El código sobrescribe "longfilepath.txt" en el directorio de trabajo actual. Sé que es poco probable que ya tengas uno, ¡pero por las dudas!
Purposeely lo quería en una sola línea:
Out-File longfilepath.txt ; cmd /c "dir /b /s /a" | ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}}
Instrucciones detalladas:
- Ejecute PowerShell
- Atraviesa el directorio que desea verificar para longitudes de ruta de archivo (C: funciona)
- Copie y pegue el código [Clic derecho para pegar en PowerShell, o Alt + Espacio> E> P]
- Espere hasta que
cat longfilepath.txt | sort
y luego vea el archivo:cat longfilepath.txt | sort
cat longfilepath.txt | sort
Explicación:
Out-File longfilepath.txt ;
- Crear (o sobrescribir) un archivo en blanco titulado ''longfilepath.txt''. Semicolon para separar los comandos.
cmd /c "dir /b /s /a" |
- Ejecute el comando dir en PowerShell, /a
para mostrar todos los archivos, incluidos los ocultos. |
a la tubería.
ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}}
ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}}
: para cada línea (denotada como $ _), si la longitud es mayor que 250, agregue esa línea al archivo.
Para rutas mayores a 260:
puedes usar:
Get-ChildItem | Where-Object {$_.FullName.Length -gt 260}
Ejemplo en 14 caracteres:
Para ver las longitudes de las rutas:
Get-ChildItem | Select-Object -Property FullName, @{Name="FullNameLength";Expression={($_.FullName.Length)}
Obtener rutas mayores que 14:
Get-ChildItem | Where-Object {$_.FullName.Length -gt 14}
Captura de pantalla:
Para nombres de archivo mayores que 10:
Get-ChildItem | Where-Object {$_.PSChildName.Length -gt 10}
Captura de pantalla:
TLPD ("directorio de ruta demasiado largo") es el programa que me salvó. Muy fácil de usar:
puedes redirigir stderr.
más explicación here , pero teniendo un comando como:
MyCommand >log.txt 2>errors.txt
debería tomar los datos que está buscando.
Además, como un truco, Windows omite esa limitación si la ruta tiene el prefijo //?/
( msdn )
Otro truco si tienes una raíz o un destino que comienza con una ruta larga, quizás SUBST
te ayudará:
SUBST Q: "C:/Documents and Settings/MyLoginName/My Documents/MyStuffToBeCopied"
Xcopy Q:/ "d:/Where it needs to go" /s /e
SUBST Q: /D
Creé la herramienta de Comprobador de longitud de ruta para este propósito, que es una buena aplicación de GUI gratuita que puede usar para ver las longitudes de ruta de todos los archivos y directorios en un directorio determinado.
También escribí y escribí en mi blog acerca de un simple script de PowerShell para obtener la longitud de archivos y directorios. Saldrá la longitud y la ruta a un archivo, y opcionalmente también lo escribirá en la consola. No se limita a mostrar archivos que tienen más de una cierta longitud (una modificación fácil de realizar), pero los muestra descendiendo por la longitud, por lo que aún es muy fácil ver qué rutas están por encima de su umbral. Aquí está:
$pathToScan = "C:/Some Folder" # The path to scan and the the lengths for (sub-directories will be scanned as well).
$outputFilePath = "C:/temp/PathLengths.txt" # This must be a file in a directory that exists and does not require admin rights to write to.
$writeToConsoleAsWell = $true # Writing to the console will be much slower.
# Open a new file stream (nice and fast) and write all the paths and their lengths to it.
$outputFileDirectory = Split-Path $outputFilePath -Parent
if (!(Test-Path $outputFileDirectory)) { New-Item $outputFileDirectory -ItemType Directory }
$stream = New-Object System.IO.StreamWriter($outputFilePath, $false)
Get-ChildItem -Path $pathToScan -Recurse -Force | Select-Object -Property FullName, @{Name="FullNameLength";Expression={($_.FullName.Length)}} | Sort-Object -Property FullNameLength -Descending | ForEach-Object {
$filePath = $_.FullName
$length = $_.FullNameLength
$string = "$length : $filePath"
# Write to the Console.
if ($writeToConsoleAsWell) { Write-Host $string }
#Write to the file.
$stream.WriteLine($string)
}
$stream.Close()
haga un dir /s /b > out.txt
y luego agregue una guía en la posición 260
En powershell cmd /c dir /s /b |? {$_.length -gt 260}
cmd /c dir /s /b |? {$_.length -gt 260}