2016-08-09 4 views
0

私はネストされたフォルダをキャブするときにディレクトリ構造を保持するPowerShellスクリプトを作成しています。私は、再帰ロジックを正しく取得するのが少し難しいです。再帰ロジック

これは大まかですので、まだ試し/キャッチエラーコードはありません。私は偶発的な実行を防ぐためにRemove-Itemをコメントアウトしました。

私がこれに対して取り組んだ論理は次のとおりです。

  • チェック&は無いディレクトリまで継続し、その後、1つのレベルアップを返すサブディレクトリに対してで
  • ゴー1レベルをベースツリーを取得し、再び
  • をご確認ください。
  • Cabディレクトリでディレクトリを削除し、自動抽出のログ(サブディレクトリcabのファイル名)を書き込みます。
  • 繰り返しプロセスの次のレベルアップと、関数呼び出しCompress-Directoryhereからである
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 
    } 
} 

ベースディレクトリまで継続します。

変更の編集:

ウィル再郵便番号間もなく(08/18)

編集08/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を移動して、各ディレクトリに少なくとも1つのファイルがあるようにすることでした。

私は現在のバージョンを以下に掲載しましたが、現在進行中です。

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