Estou usando um xcopy em um script do Windows XP para copiar recursivamente um diretório. Sempre recebo um erro de 'Memória insuficiente', que entendi ser porque um arquivo que estou tentando copiar tem um caminho muito longo. Posso reduzir facilmente o comprimento do caminho, mas infelizmente não consigo descobrir quais arquivos estão violando a restrição de comprimento do caminho. Os arquivos copiados são impressos na saída padrão (que estou redirecionando para um arquivo de log), mas a mensagem de erro é impressa no terminal, então não consigo nem descobrir aproximadamente para qual diretório o erro está sendo fornecido .
windows
windows-xp
xcopy
max-path
WestHamster
fonte
fonte
Respostas:
faça um
dir /s /b > out.txt
e, em seguida, adicione um guia na posição 260Em PowerShell
cmd /c dir /s /b |? {$_.length -gt 260}
fonte
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.
Junto com ele, apenas um caminho reduzido é impresso. por exemplo:D:\Dropbox\ProY...sh._setbinddata
. Esses são exatamente os caminhos que quero encontrar, mas não consigo ver o caminho completo! Alguma maneira de contornar isso?Get-ChildItems -r *
para de ver o arquivo ... sódir /s /b
funciona para mim.Eu criei a ferramenta Path Length Checker para esse propósito, que é um bom aplicativo GUI gratuito que você pode usar para ver os comprimentos de caminho de todos os arquivos e diretórios em um determinado diretório.
Também escrevi e bloguei sobre um script simples do PowerShell para obter tamanhos de arquivo e diretório. Ele irá mostrar o comprimento e o caminho para um arquivo e, opcionalmente, gravá-lo no console também. Ele não se limita a exibir arquivos que têm apenas um determinado comprimento (uma modificação fácil de fazer), mas os exibe em ordem decrescente de comprimento, então ainda é muito fácil ver quais caminhos estão acima do seu limite. Aqui está:
fonte
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.
Como um refinamento da solução mais simples, e se você não puder ou não quiser instalar o Powershell, basta executar:
ou (mais rápido):
E as linhas com mais de 260 chegarão ao topo da lista. Observe que você deve adicionar 1 ao parâmetro da coluna SORT (/ + n).
fonte
Fiz uma alternativa para as outras boas respostas aqui que usam PowerShell, mas a minha também salva a lista em um arquivo. Vou compartilhar aqui, caso alguém precise e queira algo assim.
Aviso: o código sobrescreve "longfilepath.txt" no diretório de trabalho atual. Eu sei que é improvável que você já tenha um, mas apenas no caso!
Desejado propositalmente em uma única linha:
Instruções detalhadas:
cat longfilepath.txt | sort
Explicação:
Out-File longfilepath.txt ;
- Crie (ou substitua) um arquivo em branco intitulado 'longfilepath.txt'. Ponto-e-vírgula para separar comandos.cmd /c "dir /b /s /a" |
- Execute o comando dir no PowerShell,/a
para mostrar todos os arquivos, incluindo arquivos ocultos.|
para canalizar.ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}}
- Para cada linha (denotada como $ _), se o comprimento for maior que 250, anexe essa linha ao arquivo.fonte
você pode redirecionar stderr.
mais explicação aqui , mas com um comando como:
deve obter os dados que você está procurando.
Além disso, como um truque, o Windows contorna essa limitação se o caminho for prefixado com
\\?\
( msdn )Outro truque, se você tiver uma raiz ou destino que começa com um longo caminho, talvez
SUBST
ajude:fonte
\\?\
que não funciona para a linha de comando. Adicionada outra ideia usandoSUBST
De http://www.powershellmagazine.com/2012/07/24/jaap-brassers-favorite-powershell-tips-and-tricks/ :
a primeira parte apenas itera por meio desta e das subpastas; usar
-ErrorVariable AccessDenied
significa empurrar os itens ofensivos para a variável powershellAccessDenied
.Você pode então percorrer a variável assim
Se você não se importa com esses arquivos (podem ser aplicáveis em alguns casos), simplesmente descarte a
-ErrorVariable AccessDenied
parte.fonte
$_.TargetObject
que não contém o caminho completo para os arquivos violadosMAX_PATH
, apenas os nomes dos diretórios e o nome do diretório pai dos arquivos ofensivos. Estou trabalhando para encontrar uma solução que não seja Robocopy, Subst ou Xcopy e postarei quando encontrar uma solução que funcione.TLPD ("diretório de caminho muito longo") é o programa que me salvou. Muito fácil de usar:
https://sourceforge.net/projects/tlpd/
fonte
Para caminhos maiores que 260:
você pode usar:
Exemplo em 14 caracteres:
Para visualizar os comprimentos dos caminhos:
Obtenha caminhos maiores que 14:
Captura de tela:
Para nomes de arquivos maiores que 10:
Captura de tela:
fonte