XP Windows 스크립트에서 xcopy를 사용하여 디렉토리를 재귀 적으로 복사하고 있습니다. 복사하려는 파일의 경로가 너무 길기 때문에 ‘메모리 부족’오류가 계속 발생합니다. 경로 길이를 쉽게 줄일 수는 있지만 불행히도 어떤 파일이 경로 길이 제한을 위반하는지 확인할 수 없습니다. 복사 된 파일은 표준 출력 (로그 파일로 리디렉션)에 인쇄되지만 오류 메시지는 터미널에 인쇄되므로 오류가 발생한 디렉터리를 대략적으로 알 수 없습니다. .
답변
a dir /s /b > out.txt
를 한 다음 위치 260에 가이드를 추가하십시오.
powershell에서 cmd /c dir /s /b |? {$_.length -gt 260}
답변
이 목적을 위해 경로 길이 검사기 도구 를 만들었습니다 . 이 도구 는 주어진 디렉토리에있는 모든 파일과 디렉토리의 경로 길이를 확인하는 데 사용할 수있는 멋진 무료 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()
답변
가장 간단한 솔루션의 개선으로 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}}
자세한 지침 :
- PowerShell 실행
- 파일 경로 길이를 확인하려는 디렉토리로 이동합니다 (C : 작동).
- 코드 복사 및 붙여 넣기 [PowerShell에 붙여 넣으려면 마우스 오른쪽 버튼을 클릭하거나 Alt + Space> E> P]
- 완료 될 때까지 기다린 다음 파일을 봅니다.
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
답변
에서 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
부품을 삭제하면 됩니다.