PowerCliを使用してVCenterサーバーインベントリですべてのフォルダパスを見つけるための再帰関数


これは、私がvcenterサーバーインベントリのすべてのフォルダパスを見つけるために書いたPowerShell/PowerCliスクリプトです.再帰的な機能は、すべてのフォルダーツリーを通過して、それぞれのフルパスを生成するためにスタックに遭遇したフォルダを押して、ポップアップします.パスは、最終的にテキストファイルに出力されるArrayListに格納されます.

コード


    function build_folder_paths {
        Param($folders)
        foreach($folder in $folders) {
            $stack.Push($folder.Name)
            $sub_folders = $folder | Get-Folder -type VM -norecursion
            $stack_array = $stack.ToArray()
            [array]::Reverse($stack_array)
            $folder_path = $stack_array -join "/"
            $folder_paths.Add($folder_path)
            Write-Host("Folder Path: " + $folder_path)
            if(!$sub_folders) {
                try {
                    $stack.Pop() | Out-Null
                } catch {
                    Write-Host("Stack Empty.")
                }
            } else {
                build_folder_paths($sub_folders)
            }
        }
        try {
            $stack.Pop() | Out-Null
        } catch {
            Write-Host("Stack Empty.")
        }
    }

    $folder_paths = New-Object -TypeName "System.Collections.ArrayList"
    $stack = New-Object -TypeName "System.Collections.Stack"
    $start_folders = Get-Folder VM -type VM | Get-Folder -type VM -norecursion
    build_folder_paths($start_folders)
    $folder_paths | Out-File ./folder_paths.txt

コード説明


  • 機能
  • 機能build_folder_paths$folders パラメータ
  • 最初の呼び出しで$folders パラメータは、Vcenterインベントリのルートにあるフォルダのリストを保持します.
  • ごとに$folder イン$folders :
  • プッシュする$folder を返します.
  • 我々はすぐにフェッチ$sub_folders その$folder .
  • スタックを配列に変換し、それを反転しますので、スタックの一番上にインデックスがあります.
  • 我々は配列に参加する/ フォルダパスを構築するには
  • 我々は$folder_path$folder_paths Arraylist .
  • ない場合$sub_folders これで$folder , 我々はスタックをポップします.
  • そしてforeach 次のループを繰り返す$folder イン$folders .
  • があるならば$sub_folders これで$folder , その後、関数とパスを再帰的に呼び出します$sub_folders それ.
  • 結局$sub_folders は再帰的な呼び出しで処理される.$folder スタックから再帰的な呼び出しを返します.
  • 再帰的な呼び出しが戻るとき、その呼び出し元は続けます.

  • スタート
  • 私たちは$folder_paths すべてのフォルダパスを格納するArrayList.
  • 私たちは$stack 各フォルダのパスをビルドします.
  • 私たちは$start_folders vcenterインベントリフォルダーツリーのルートですべての即時サブフォルダを取得することによって.
  • 私たちはbuild_folder_paths 機能とパス$start_folders として$folders パラメータ
  • すべてのフォルダが訪問されるまで、この関数は再帰的にそれ自身を呼び出します、そして、あらゆるパスは生成されます.

  • 終わり
  • 最後に、$folder_paths ArrayListをテキストファイルに書き込みます.
  • 単純な例


    以下のフォルダ構造を持っています
        ├── folder1
        │   ├── folder1a
        │   └── folder1b
        └── folder2
    
    1 .関数はfolder1 , スタックにプッシュし、サブフォルダを取り出し、そのフォルダパスを構築し、そのパスをArrayListに追加します.
        stack:
            folder1 <-- top
        sub-folders:
            ['folder1a','folder1b']
        path:
            folder1
        ArrayList:
            ['folder1']
    
  • サブフォルダがあるのでfolder1 , 関数を再帰的に呼び出しますbuild_folder_paths パス$sub_folders それ.
  • 2 .関数はfolder1a , スタックにプッシュし、サブフォルダを取り出し、そのフォルダパスを構築し、そのパスをArrayListに追加します.
        stack:
            folder1a <-- top
            folder1
        sub-folders:
            none
        path:
            folder1/folder1a
        ArrayList:
            ['folder1','folder1/folder1a']
    

  • サブフォルダがないのでfolder1a , スタックからポップされ、foreach ループはfolder1b .
    stack:
        folder1 <-- top
    
  • 3 .関数はfolder1b , スタックにプッシュし、サブフォルダを取り出し、そのフォルダパスを構築し、そのパスをArrayListに追加します.
        stack:
            folder1b <-- top
            folder1
        sub-folders:
            none
        path:
            folder1/folder1b
        ArrayList:
            ['folder1','folder1/folder1a', 'folder1/folder1b']
    

  • サブフォルダがないのでfolder1b , スタックからポップされます.
    stack:
        folder1 <-- top
    

  • これ以上のフォルダがないのでforeach ループを処理するにはfolder1 ), the foreach ループ終了folder1 がスタックからポップされます.
    stack:
        empty
    
  • 再帰関数コールは戻り、初期の関数呼び出しは継続する.
  • 4 .関数を見るfolder2 , スタックにプッシュし、サブフォルダを取り出し、そのフォルダパスを構築し、そのパスをArrayListに追加します.
        stack:
            folder2 <-- top
        sub-folders:
            none
        path:
            folder2
        ArrayList:
            ['folder1','folder1/folder1a', 'folder1/folder1b', 'folder2']
    

  • サブフォルダがないのでfolder2 , スタックからポップされます.
    stack:
        empty
    
  • これ以上のフォルダがないのでforeach ループを処理する(最初の関数呼び出しからフォルダを処理していることを忘れないでください)foreach ループ終了.
  • スタックから親フォルダをポップしようとしますが、スタックは空で、例外が見つかります.
  • この時点で、すべてのフォルダが訪問されており、すべてのフォルダのパスが生成されている.
  • 資源

  • https://developer.vmware.com/powercli/
  • https://developer.vmware.com/docs/powercli/latest/products/