중첩 된 폴더를 가져올 때 디렉터리 구조를 보존 할 PowerShell 스크립트를 작업하고 있습니다. 그래도 재귀 논리를 올바르게 만드는 데 어려움이 있습니다.재귀 논리
이것은 거칠기 때문에 아직 시도/catch 오류 코드가 없습니다. 우발적 인 실행을 막기 위해 Remove-Item
을 주석 처리했습니다.
내가 이것을 위해 고안 한 논리는 다음과 같습니다. 하위 디렉토리에
- 확인 & GET 기본 트리.
- Cab 디렉토리에서 디렉토리를 제거하고 자동 추출 (서브 디렉토리 cab의 파일 이름)을위한 로그를 작성하십시오. 기본 디렉토리
function Chkfordir ($clevel)
{
$dir = dir $clevel | ? { $_.PSIsContainer -eq $true } #Does Current Level have Folders?
if($dir -ne $null) # Yes
{
Chkfordir $dir #Go Deeper
}
if ($dir -eq $null) #Deepest Branch
{
return # Go Back One Level and begin Cabbing
}
$dir | % {
Compress-Directory $_.FullName (".\" + [string]$_.Name + ".cab")
echo ($_.FullName + ".cab" >> .\cleaf.log"
#Remove-Item -Recurse $_.FullName
return
}
}
Compress-Directory
이 here에서 인 함수 호출 할 때까지
편집 변경 :
재 게시 할 예정입니다 코드 곧 (8월 18일)
편집 8월 18일 그래서 내가 마지막으로 테스트 할 수있는 기회를했고 논리가 지금 작동하는 것 같다. 몇 가지 문제가있었습니다.
대부분의 어려움은 powershell gotcha와 Compress-Directory가 경로 독립적 인 주목받지 못한 문제와 함께 나타납니다. 나중에이 함수를 경로 독립적 인 것으로 다시 작성해야 할 것처럼 보입니다.
powershell gotcha는 파이프 라인의 값에 대한 유형 변경되었습니다. 분명히 함수 디렉터리에서 반환 된 후 System.IO.FileInfo에서 System.IO.DirectoryInfo로 항목이 다르게 명명 된 멤버 함수로 변경되었습니다.
리디렉션 연산자가 powershell에서 작동하지 않으므로 Echo가 Add-Content로 바뀌 었습니다.
주장할만한 일부 주들도있었습니다. 파일이없는 리프 디렉토리는 Compress-Directory가 파일을 만들지 않고 자동으로 오류나 완료하도록합니다 (따라서 계층 구조가 유지되지 않음).
해결책으로 돌아 가기 전에 리프 폴더에 Add-Content를 추가하고 Compress-Directory 앞에 Add-Content를 추가하여 각 디렉토리에 하나 이상의 파일이 있도록했습니다.
아래에 현재 버전을 포함 시켰지만 진행 중입니다.
function Chkfordir ($clevel)
{
$dir = dir $clevel | ? { $_.PSIsContainer -eq $true } # Get Folders?
if ($dir -eq $null) { #Check if deepest branch
Add-Content (Join-Path $_.PSPath "\leaf.log") ([string]$_.FullName + ".cab")
return $_ # Return one level up and cab
}
$dir | % { #for each sub go deeper
Chkfordir $_.FullName
Add-Content (Join-Path $_.PSParentPath "\branch.log") ([string]$_.FullName + ".cab")
Compress-Directory $_.FullName ([string]$_.Name + ".cab")
#Remove-Item $_.FullName -recurse
}
}
감사합니다. 나는 각 하위 디렉토리를 가져 가지 않고 거기에서 되풀이되는 것을 알아 채지 못했습니다. 코드를 업데이트했고 나중에 시간이있을 때 나중에 테스트 할 것입니다. – Lorek