get-childitem 子文件夹或 "rbac.jsonc" 文件
get-childitem either subfolder or a "rbac.jsonc" file
我想检查是否所有文件夹都包含子文件夹或 rbac.jsonc 文件。
- 我想遍历作为根文件夹的文件夹列表 $topMgFolderPath。
- 我想一直沿着文件夹树向下看
- 如果有任何不符合我条件的情况,我希望触发 Pester 测试失败。
- 我希望文件夹有一个 rbac.json 文件,在这种情况下,该文件夹中的所有子文件夹都将在任何进一步处理中被忽略,或者至少有一个子文件夹本身包含一个 rbac.jsonc 文件或更多子文件夹,这些子文件夹将指向这样的文件。
- 在所有情况下,.policy 文件夹将被忽略
这有可能吗?
你的问题对我来说不够清晰。
根据你的post,我的理解是:
- 您想遍历作为根文件夹的文件夹列表
$topMgFolderPath
。
- 您在代码示例中使用了
-Recurse
,所以我假设您想要一直沿用树
- 根据您以
| should -BeNullOrEmpty
结尾的第二行代码,如果有任何不符合您的条件的情况,您希望触发 Pester 测试失败。
- 您希望文件夹有一个
rbac.json
文件,在这种情况下,该文件夹中的所有子文件夹将在任何进一步处理中被忽略,或者至少有一个子文件夹本身包含一个 rbac.json 文件或更多子文件夹,这些子文件夹将指向此类文件。
- 在所有情况下,
.policy
文件夹将被忽略
如果我没有得到正确的前提,请使用更多详细信息更新您的问题或澄清情况。
在任何情况下,您想要做的事情都是可能的,但不是通过单个 Get-ChildItem
语句。
我的方法是通过单层自制 -recurse
方法,因为你想要一个带有多次检查的递归操作,一旦它被验证就停止处理一个文件夹Get-ChildItem
在递归“手动”完成的队列旁边,在 while 循环中一次一层,一直持续到队列被清除。
$topMgFolderPath = 'C:\temp\'
$queue = [System.Collections.Queue]::new()
$InvalidFolders = [System.Collections.Generic.List[PSobject]]::new()
$Directories = Get-ChildItem -path $topMgFolderPath -Exclude '.policy' -Directory
$Directories | % { $queue.Enqueue($_.FullName) }
while ($Queue.Count -gt 0) {
$dir = $queue.Dequeue()
$HasRbacFile = Test-Path -Path "$dir\rbac.json"
# If Rbac file exist, we stop processing this item
if ($HasRbacFile) { Continue }
$SubDirectories = Get-ChildItem -Path $dir -Directory -Exclude '.policy'
# If the rbac file was not found and no subfolders exist, then it is invalid
if ($SubDirectories.count -eq 0) {
$InvalidFolders.Add($dir)
} else {
# Subdirectories found are enqueued so we can check them
$SubDirectories | % {$queue.Enqueue($_.FullName)}
}
}
# Based on your second line of code where you performed that validation.
$InvalidFolders | should -BeNullOrEmpty
所有重要的事情都发生在主要逻辑所在的 while 循环中
- 有 rbac 文件吗?
- 如果没有,是否有任何子文件夹(不是 .policy)要检查?
参考资料
我想检查是否所有文件夹都包含子文件夹或 rbac.jsonc 文件。
- 我想遍历作为根文件夹的文件夹列表 $topMgFolderPath。
- 我想一直沿着文件夹树向下看
- 如果有任何不符合我条件的情况,我希望触发 Pester 测试失败。
- 我希望文件夹有一个 rbac.json 文件,在这种情况下,该文件夹中的所有子文件夹都将在任何进一步处理中被忽略,或者至少有一个子文件夹本身包含一个 rbac.jsonc 文件或更多子文件夹,这些子文件夹将指向这样的文件。
- 在所有情况下,.policy 文件夹将被忽略
这有可能吗?
你的问题对我来说不够清晰。
根据你的post,我的理解是:
- 您想遍历作为根文件夹的文件夹列表
$topMgFolderPath
。 - 您在代码示例中使用了
-Recurse
,所以我假设您想要一直沿用树 - 根据您以
| should -BeNullOrEmpty
结尾的第二行代码,如果有任何不符合您的条件的情况,您希望触发 Pester 测试失败。 - 您希望文件夹有一个
rbac.json
文件,在这种情况下,该文件夹中的所有子文件夹将在任何进一步处理中被忽略,或者至少有一个子文件夹本身包含一个 rbac.json 文件或更多子文件夹,这些子文件夹将指向此类文件。 - 在所有情况下,
.policy
文件夹将被忽略
如果我没有得到正确的前提,请使用更多详细信息更新您的问题或澄清情况。
在任何情况下,您想要做的事情都是可能的,但不是通过单个 Get-ChildItem
语句。
我的方法是通过单层自制 -recurse
方法,因为你想要一个带有多次检查的递归操作,一旦它被验证就停止处理一个文件夹Get-ChildItem
在递归“手动”完成的队列旁边,在 while 循环中一次一层,一直持续到队列被清除。
$topMgFolderPath = 'C:\temp\'
$queue = [System.Collections.Queue]::new()
$InvalidFolders = [System.Collections.Generic.List[PSobject]]::new()
$Directories = Get-ChildItem -path $topMgFolderPath -Exclude '.policy' -Directory
$Directories | % { $queue.Enqueue($_.FullName) }
while ($Queue.Count -gt 0) {
$dir = $queue.Dequeue()
$HasRbacFile = Test-Path -Path "$dir\rbac.json"
# If Rbac file exist, we stop processing this item
if ($HasRbacFile) { Continue }
$SubDirectories = Get-ChildItem -Path $dir -Directory -Exclude '.policy'
# If the rbac file was not found and no subfolders exist, then it is invalid
if ($SubDirectories.count -eq 0) {
$InvalidFolders.Add($dir)
} else {
# Subdirectories found are enqueued so we can check them
$SubDirectories | % {$queue.Enqueue($_.FullName)}
}
}
# Based on your second line of code where you performed that validation.
$InvalidFolders | should -BeNullOrEmpty
所有重要的事情都发生在主要逻辑所在的 while 循环中
- 有 rbac 文件吗?
- 如果没有,是否有任何子文件夹(不是 .policy)要检查?
参考资料