XP Windows 스크립트에서 xcopy를 사용하여 디렉토리를 재귀 적으로 복사하고 있습니다. 복사하려는 파일의 경로가 너무 길기 때문에 '메모리 부족'오류가 계속 발생합니다. 경로 길이를 쉽게 줄일 수는 있지만 불행히도 어떤 파일이 경로 길이 제한을 위반하는지 확인할 수 없습니다. 복사 된 파일은 표준 출력 (로그 파일로 리디렉션)에 인쇄되지만 오류 메시지는 터미널에 인쇄되므로 오류가 발생한 디렉터리를 대략적으로 알 수 없습니다. .
XP Windows 스크립트에서 xcopy를 사용하여 디렉토리를 재귀 적으로 복사하고 있습니다. 복사하려는 파일의 경로가 너무 길기 때문에 '메모리 부족'오류가 계속 발생합니다. 경로 길이를 쉽게 줄일 수는 있지만 불행히도 어떤 파일이 경로 길이 제한을 위반하는지 확인할 수 없습니다. 복사 된 파일은 표준 출력 (로그 파일로 리디렉션)에 인쇄되지만 오류 메시지는 터미널에 인쇄되므로 오류가 발생한 디렉터리를 대략적으로 알 수 없습니다. .
답변:
a dir /s /b > out.txt
를 한 다음 위치 260에 가이드를 추가하십시오.
powershell에서 cmd /c dir /s /b |? {$_.length -gt 260}
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.
과 같은 오류가 발생합니다. 이와 함께 단축 된 경로 만 인쇄됩니다. 예 : D:\Dropbox\ProY...sh._setbinddata
. 그것들은 내가 찾고 싶은 경로들과 정확히 일치하지만 전체 경로를 볼 수 없습니다! 이 주위에 어떤 방법이 있습니까?
Get-ChildItems -r *
... 단지 파일을 보는 중지 dir /s /b
작품 나를 위해.
이 목적을 위해 경로 길이 검사기 도구 를 만들었습니다 . 이 도구 는 주어진 디렉토리에있는 모든 파일과 디렉토리의 경로 길이를 확인하는 데 사용할 수있는 멋진 무료 GUI 앱입니다.
또한 파일 및 디렉터리 길이를 가져 오는 간단한 PowerShell 스크립트 에 대해 작성하고 블로그에 올렸 습니다. 파일의 길이와 경로를 출력하고 선택적으로 콘솔에도 기록합니다. 특정 길이 (쉽게 수정할 수 있음)를 초과하는 파일 만 표시하는 것이 아니라 길이별로 내림차순으로 표시되므로 임계 값을 초과하는 경로를 확인하는 것은 여전히 매우 쉽습니다. 여기있어:
$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()
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.
가장 간단한 솔루션의 개선으로 Powershell을 설치할 수 없거나 설치할 수없는 경우 다음을 실행하십시오.
dir /s /b | sort /r /+261 > out.txt
또는 (빠름) :
dir /s /b | sort /r /+261 /o out.txt
그리고 260보다 긴 줄은 목록의 맨 위에 올 것입니다. SORT 열 매개 변수 (/ + n)에 1을 추가해야합니다.
PowerShell을 사용하는 다른 좋은 답변에 대한 대안을 만들었지 만 내 목록도 파일에 저장합니다. 다른 사람이 필요한 경우 여기에서 공유합니다.
경고 : 코드는 현재 작업 디렉토리의 "longfilepath.txt"를 덮어 씁니다. 나는 당신이 이미 가지고있을 것 같지 않다는 것을 압니다. 그러나 만일을 위해!
의도적으로 한 줄로 원했습니다.
Out-File longfilepath.txt ; cmd /c "dir /b /s /a" | ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}}
자세한 지침 :
cat longfilepath.txt | sort
설명:
Out-File longfilepath.txt ;
– 'longfilepath.txt'라는 제목의 빈 파일을 작성하거나 덮어 씁니다. 명령을 구분하는 세미콜론.
cmd /c "dir /b /s /a" |
– PowerShell에서 dir 명령을 실행 /a
하여 숨겨진 파일을 포함한 모든 파일을 표시합니다. |
파이프에.
ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}}
– 각 행 ($ _로 표시)에 대해 길이가 250보다 크면 해당 행을 파일에 추가하십시오.
stderr을 리디렉션 할 수 있습니다.
여기에 자세한 설명이 있지만 다음과 같은 명령이 있습니다.
MyCommand >log.txt 2>errors.txt
찾고있는 데이터를 가져와야합니다.
또한 트릭으로 Windows는 경로에 \\?\
( msdn ) 접두사가 붙은 경우 해당 제한을 우회합니다.
긴 경로로 시작하는 루트 또는 대상이있는 경우 또 다른 트릭 SUBST
이 도움이 될 것 입니다.
SUBST Q: "C:\Documents and Settings\MyLoginName\My Documents\MyStuffToBeCopied"
Xcopy Q:\ "d:\Where it needs to go" /s /e
SUBST Q: /D
\\?\
명령 줄에서 작동하지 않는 것 같습니다 . 사용하여 다른 아이디어를 추가SUBST
에서 http://www.powershellmagazine.com/2012/07/24/jaap-brassers-favorite-powershell-tips-and-tricks/ :
Get-ChildItem –Force –Recurse –ErrorAction SilentlyContinue –ErrorVariable AccessDenied
첫 번째 부분은이 폴더와 하위 폴더를 반복합니다. using -ErrorVariable AccessDenied
은 문제가되는 항목을 powershell 변수로 푸시하는 것을 의미합니다 AccessDenied
.
그런 다음 다음과 같이 변수를 스캔 할 수 있습니다.
$AccessDenied |
Where-Object { $_.Exception -match "must be less than 260 characters" } |
ForEach-Object { $_.TargetObject }
이러한 파일에 대해 신경 쓰지 않는 경우 (경우에 따라 적용 가능할 수 있음) -ErrorVariable AccessDenied
부품을 삭제하면 됩니다.
$_.TargetObject
하는 파일 의 전체 경로를 포함하지 않고 Directory namesMAX_PATH
만 및 문제가되는 파일 의 상위 디렉토리 이름 을 포함하지 않는다는 것 입니다. 비 Robocopy 또는 Subst 또는 Xcopy 솔루션을 찾는 중이며 작동하는 솔루션을 찾으면 게시 할 예정입니다.
TLPD ( "너무 긴 경로 디렉토리")는 나를 구해준 프로그램입니다. 사용하기 매우 쉬움 :
260보다 큰 경로의 경우 다음
을 사용할 수 있습니다.
Get-ChildItem | Where-Object {$_.FullName.Length -gt 260}
14
자의 예 : 경로 길이를 보려면 다음을 수행하십시오.
Get-ChildItem | Select-Object -Property FullName, @{Name="FullNameLength";Expression={($_.FullName.Length)}
14보다 큰 경로 가져 오기 :
Get-ChildItem | Where-Object {$_.FullName.Length -gt 14}
스크린 샷 :
10보다 큰 파일 이름의 경우 :
Get-ChildItem | Where-Object {$_.PSChildName.Length -gt 10}
스크린 샷 :