get-childitem 子文件夹或 "rbac.jsonc" 文件

get-childitem either subfolder or a "rbac.jsonc" file

我想检查是否所有文件夹都包含子文件夹或 rbac.jsonc 文件。

这有可能吗?

你的问题对我来说不够清晰。

根据你的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)要检查?

参考资料

Queue Class