PowerCliを使用してVCenterサーバーインベントリですべてのフォルダパスを見つけるための再帰関数
5901 ワード
これは、私がvcenterサーバーインベントリのすべてのフォルダパスを見つけるために書いたPowerShell/PowerCliスクリプトです.再帰的な機能は、すべてのフォルダーツリーを通過して、それぞれのフルパスを生成するためにスタックに遭遇したフォルダを押して、ポップアップします.パスは、最終的にテキストファイルに出力されるArrayListに格納されます.
機能 機能 最初の呼び出しで ごとに プッシュする 我々はすぐにフェッチ スタックを配列に変換し、それを反転しますので、スタックの一番上にインデックスがあります. 我々は配列に参加する 我々は ない場合 そして があるならば 結局 再帰的な呼び出しが戻るとき、その呼び出し元は続けます.
スタート 私たちは 私たちは 私たちは 私たちは すべてのフォルダが訪問されるまで、この関数は再帰的にそれ自身を呼び出します、そして、あらゆるパスは生成されます.
終わり 最後に、
以下のフォルダ構造を持っています
サブフォルダがあるので 2 .関数は
サブフォルダがないので
3 .関数は
サブフォルダがないので
これ以上のフォルダがないので
再帰関数コールは戻り、初期の関数呼び出しは継続する. 4 .関数を見る
サブフォルダがないので
これ以上のフォルダがないので スタックから親フォルダをポップしようとしますが、スタックは空で、例外が見つかります. この時点で、すべてのフォルダが訪問されており、すべてのフォルダのパスが生成されている. https://developer.vmware.com/powercli/ https://developer.vmware.com/docs/powercli/latest/products/
コード
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
それ.folder1a
, スタックにプッシュし、サブフォルダを取り出し、そのフォルダパスを構築し、そのパスをArrayListに追加します. stack:
folder1a <-- top
folder1
sub-folders:
none
path:
folder1/folder1a
ArrayList:
['folder1','folder1/folder1a']
サブフォルダがないので
folder1a
, スタックからポップされ、foreach
ループはfolder1b
.stack:
folder1 <-- top
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
folder2
, スタックにプッシュし、サブフォルダを取り出し、そのフォルダパスを構築し、そのパスをArrayListに追加します. stack:
folder2 <-- top
sub-folders:
none
path:
folder2
ArrayList:
['folder1','folder1/folder1a', 'folder1/folder1b', 'folder2']
サブフォルダがないので
folder2
, スタックからポップされます.stack:
empty
foreach
ループを処理する(最初の関数呼び出しからフォルダを処理していることを忘れないでください)foreach
ループ終了.資源
Reference
この問題について(PowerCliを使用してVCenterサーバーインベントリですべてのフォルダパスを見つけるための再帰関数), 我々は、より多くの情報をここで見つけました https://dev.to/tomkanabay/recursive-function-to-find-all-folder-paths-in-vcenter-server-inventory-using-powercli-lhaテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol