J'utilise un xcopy dans un script Windows XP pour copier récursivement un répertoire. Je continue à recevoir une erreur «Mémoire insuffisante», ce que je comprends, car un fichier que j'essaie de copier a un chemin trop long. Je peux facilement réduire la longueur du chemin, mais malheureusement, je ne peux pas déterminer quels fichiers enfreignent la restriction de longueur de 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, donc je ne peux même pas déterminer approximativement le répertoire pour lequel l'erreur est donnée .
windows
windows-xp
xcopy
max-path
WestHamster
la source
la source
Réponses:
faire a
dir /s /b > out.txt
puis ajouter un guide à la position 260Dans PowerShell
cmd /c dir /s /b |? {$_.length -gt 260}
la source
Get-ChildItem : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.
Parallèlement, seul un chemin raccourci est imprimé. par exemple:D:\Dropbox\ProY...sh._setbinddata
. Ce sont exactement les chemins que je veux trouver, mais je ne peux pas voir tout le chemin! Un moyen de contourner cela?Get-ChildItems -r *
cesse de voir le fichier ... nedir /s /b
fonctionne que pour moi.J'ai créé l'outil de vérification de la longueur du chemin à cette fin, qui est une belle application graphique gratuite que vous pouvez utiliser pour voir les longueurs de chemin de tous les fichiers et répertoires dans un répertoire donné.
J'ai également é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 vers un fichier, et éventuellement l'écrira également sur la console. Il ne se limite pas à afficher les fichiers qui ne dépassent qu'une certaine longueur (une modification facile à faire), mais les affiche en ordre décroissant de longueur, il est donc toujours très facile de voir quels chemins dépassent votre seuil. C'est ici:
la source
Get-ChildItem : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.
Pour affiner la solution la plus simple, et si vous ne pouvez pas ou ne voulez pas installer Powershell, exécutez simplement:
ou (plus rapide):
Et les lignes de plus de 260 arriveront en tête de liste. Notez que vous devez ajouter 1 au paramètre de colonne SORT (/ + n).
la source
J'ai fait une alternative aux autres bonnes réponses ici qui utilise PowerShell, mais la mienne enregistre également la liste dans un fichier. Je le partagerai 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ù!
Le voulait exprès en une seule ligne:
Des instructions détaillées:
cat longfilepath.txt | sort
Explication:
Out-File longfilepath.txt ;
- Créez (ou écrasez) un fichier vierge 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.|
à la canalisation.ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}}
- Pour chaque ligne (notée $ _), si la longueur est supérieure à 250, ajoutez cette ligne au fichier.la source
vous pouvez rediriger stderr.
plus d'explications ici , mais ayant une commande comme:
devrait saisir les données que vous recherchez.
De plus, comme astuce, Windows contourne cette limitation si le chemin est préfixé par
\\?\
( msdn )Une autre astuce si vous avez une racine ou une destination qui commence par un long chemin, vous
SUBST
aidera peut - être :la source
\\?\
ne pas fonctionner pour la ligne de commande. Ajout d'une autre idée utilisantSUBST
De http://www.powershellmagazine.com/2012/07/24/jaap-brassers-favorite-powershell-tips-and-tricks/ :
la première partie parcourt simplement ce dossier et ses sous-dossiers; en utilisant
-ErrorVariable AccessDenied
signifie pousser les éléments incriminés dans la variable powershellAccessDenied
.Vous pouvez ensuite parcourir la variable comme ceci
Si vous ne vous souciez pas de ces fichiers (peut être applicable dans certains cas), déposez simplement la
-ErrorVariable AccessDenied
pièce.la source
$_.TargetObject
que ne contient pas le chemin complet des fichiers qui violentMAX_PATH
, uniquement les noms de répertoire et le nom de répertoire parent des fichiers incriminés. Je travaille sur la recherche d'une solution non-Robocopy ou Subst ou Xcopy, et publierai quand je trouverai une solution fonctionnelle.TLPD ("répertoire de chemin trop long") est le programme qui m'a sauvé. Utilisation très simple:
https://sourceforge.net/projects/tlpd/
la source
Pour les chemins supérieurs à 260:
vous pouvez utiliser:
Exemple sur 14 caractères:
Pour afficher les longueurs des chemins:
Obtenez des chemins supérieurs à 14:
Capture d'écran:
Pour les noms de fichiers supérieurs à 10:
Capture d'écran:
la source