J'utilise un xcopy dans un script de Windows XP pour copier récursivement un répertoire. Je continue à obtenir une erreur 'Mémoire insuffisante', qui, d'après ce que je comprends, est due au fait qu'un fichier que j'essaie de copier a un chemin trop long. Je peux facilement réduire la longueur du chemin, mais malheureusement, je n'arrive pas à déterminer quels sont les fichiers qui violent la restriction de longueur du chemin. Les fichiers copiés sont imprimés sur la sortie standard (que je redirige vers un fichier journal), mais le message d'erreur est imprimé sur le terminal, ce qui fait que je ne peux même pas savoir approximativement pour quel répertoire l'erreur est donnée.
Réponses
Trop de publicités?J'ai créé l'outil Path Length Checker Il s'agit d'une application GUI gratuite que vous pouvez utiliser pour voir la longueur des chemins de tous les fichiers et répertoires dans un répertoire donné.
J'ai aussi écrit et blogué sur un simple script PowerShell. pour obtenir la longueur des fichiers et des répertoires. Il affichera la longueur et le chemin d'un fichier, et éventuellement l'écrira à la console. Il ne se limite pas à afficher les fichiers qui dépassent une certaine longueur (une modification facile à faire), mais les affiche en ordre décroissant de longueur, de sorte qu'il est toujours très facile de voir quels chemins dépassent votre seuil. Le voici :
$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()
Comme raffinement de la solution la plus simple, et si vous ne pouvez ou ne voulez pas installer Powershell, exécutez simplement :
dir /s /b | sort /r /+261 > out.txt
ou (plus rapide) :
dir /s /b | sort /r /+261 /o out.txt
Et les lignes plus longues que 260 arriveront en haut de la liste. Notez que vous devez ajouter 1 au paramètre de la colonne SORT (/+n).
J'ai créé une alternative aux autres bonnes réponses ici qui utilise PowerShell, mais la mienne enregistre également la liste dans un fichier. Je la partage ici au cas où quelqu'un d'autre aurait besoin de quelque chose comme ça.
Attention : Le code écrase "longfilepath.txt" dans le répertoire de travail actuel. Je sais qu'il est peu probable que vous en ayez déjà un, mais juste au cas où !
Je l'ai volontairement voulu en une seule ligne :
Out-File longfilepath.txt ; cmd /c "dir /b /s /a" | ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}}
Instructions détaillées :
- Exécuter PowerShell
- Traverse jusqu'au répertoire dans lequel vous voulez vérifier la longueur des chemins de fichiers (C : fonctionne).
- Copiez et collez le code [Cliquez avec le bouton droit de la souris pour coller dans PowerShell, ou Alt + Espace > E > P].
- Attendez que ce soit fait, puis visualisez le fichier :
cat longfilepath.txt | sort
Explication :
Out-File longfilepath.txt ;
- Créez (ou écrasez) un fichier vide intitulé 'longfilepath.txt'. Point-virgule pour séparer les commandes.
cmd /c "dir /b /s /a" |
- Exécutez la commande dir sur PowerShell, /a
pour afficher tous les fichiers, y compris les fichiers cachés. |
au tuyau.
ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}}
- Pour chaque ligne (désignée par $_), si sa longueur est supérieure à 250, ajoutez cette ligne au fichier.
En http://www.powershellmagazine.com/2012/07/24/jaap-brassers-favorite-powershell-tips-and-tricks/ :
Get-ChildItem –Force –Recurse –ErrorAction SilentlyContinue –ErrorVariable AccessDenied
la première partie ne fait qu'itérer à travers ce dossier et ses sous-dossiers ; en utilisant la fonction -ErrorVariable AccessDenied
signifie pousser les éléments incriminés dans la variable powershell AccessDenied
.
Vous pouvez ensuite parcourir la variable comme suit
$AccessDenied |
Where-Object { $_.Exception -match "must be less than 260 characters" } |
ForEach-Object { $_.TargetObject }
Si vous ne vous préoccupez pas de ces fichiers (ce qui peut être le cas dans certains cas), il suffit de laisser tomber le fichier -ErrorVariable AccessDenied
partie.
- Réponses précédentes
- Plus de réponses