2016-08-09 2 views
0

중첩 된 폴더를 가져올 때 디렉터리 구조를 보존 할 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-Directoryhere에서 인 함수 호출 할 때까지

  • 반복 과정 다음 레벨까지 계속.

    편집 변경 :

    재 게시 할 예정입니다 코드 곧 (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 
        }   
    } 
    
  • 답변

    0

    당신은 재귀 호출이 돌아 오면 그것을 각 하위 디렉토리에 대한 재귀 및 압축해야 당신이 반환로

    function Chkfordir($clevel) { 
        Get-ChildItem $clevel | 
         Where-Object { $_.PSIsContainer } | 
         ForEach-Object { 
          Chkfordir $_ 
          Compress-Directory ... 
          ... 
         } 
    } 
    

    자동으로 처음 내려 그 방법은 다음 아카이브를 만들 수 있습니다.

    +0

    감사합니다. 나는 각 하위 디렉토리를 가져 가지 않고 거기에서 되풀이되는 것을 알아 채지 못했습니다. 코드를 업데이트했고 나중에 시간이있을 때 나중에 테스트 할 것입니다. – Lorek