文本文件的递归循环以找到最低级别

Recursive Looping of Text Files to find lowest level

我有一些文本文件,基本上称为作业,其中一个作业可以包含另一个作业或一系列作业,其中可以包含另一个作业或一系列作业,等等...本质上调用它包含的作业。

我们的想法是遍历最顶层的文件,进入下一个较低的文件等等,直到我们到达“最低层”。

我目前使用的脚本是循环,循环中,循环中。如果我需要进一步向下,我需要添加另一个循环。在此示例中,我们忽略其中包含“JOB”的文件的内容。

是否有更好的方法来循环或迭代所有这些,而不仅仅是在 ForEach-Objects 中添加更多 ForEach-Objects?

cd C:\Files
$files = Get-ChildItem -Name

$files | ForEach-Object {

   $filename1 = $_
   write-host "$filename1"

   $step1 = Get-Content $filename1
   $step1 | ForEach-Object {

       $filename2 = $_
       write-host "`t$filename2" #We tab to show 2nd level job is inside 1st level job
       
       $step2 = Get-Content $filename2
       $step2 | ForEach-Object {

           $filename3 = $_
           $write-host "`t`t$filename3"

           $step3 = Get-Content $filename3
           $step3 | ForeEach-Object {#keep adding loops}
      }
   }
}

jobs/files 都包含在一个目录中:

FILE1A
FILE1B
FILE1C
FILE2
FILE3
FILE4

等..

每个文件的内容可能如下所示:

JOB FILE1B

不限制多少个“JOB ???”可能包含在文件中。

这些 files/jobs 的命名确实没有约定俗成。当 运行 脚本时,结果应该是这样的:

FILE1A
   FILE1B
FILE1C
   FILE2
   FILE3
   FILEXYZ
      FILEZYX
         FILE123
   FILEABC

正如评论中的其他人所提到的,可以使用递归来完成此操作。

我希望我在模型中理解了这个问题。

我有一些文件看起来像下面这样,有些包含带有其他文件路径的行,有些则没有(0 长度空文件)

    Directory: C:\temp\powershell\recursive_tests

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---          18.08.2021    19:31            133 A1.txt
-a---          18.08.2021    19:14              0 A1a.txt
-a---          18.08.2021    19:31            133 A1b.txt
-a---          18.08.2021    19:18              0 A1b1.txt
-a---          18.08.2021    19:18              0 A1b2.txt
-a---          18.08.2021    19:18              0 A1b3.txt
-a---          18.08.2021    19:14              0 A1c.txt
-a---          18.08.2021    19:31            133 B1.txt
-a---          18.08.2021    19:31            133 B1a.txt
-a---          18.08.2021    19:18              0 B1a1.txt
-a---          18.08.2021    19:18              0 B1a2.txt
-a---          18.08.2021    19:18              0 B1a3.txt
-a---          18.08.2021    19:14              0 B1b.txt
-a---          18.08.2021    19:31            133 B1c.txt
-a---          18.08.2021    19:18              0 B1c1.txt
-a---          18.08.2021    19:18              0 B1c2.txt
-a---          18.08.2021    19:18              0 B1c3.txt

例如 A1.txt 看起来像这样

C:\temp\powershell\recursive_tests\A1a.txt
C:\temp\powershell\recursive_tests\A1b.txt
C:\temp\powershell\recursive_tests\A1c.txt

我想通过它们处理的代码可能看起来像这样

function Get-FileInFile {
    param(
        [string[]]$Paths,
        $Level = 0
    )
    foreach ($path in $Paths) {
        Write-Host "$("`t" * $Level)$Path"
        $lines = Get-Content -Path $Path
        $newLevel = $Level + 1
        $lines | ForEach-Object {
            get-fileinfile -Path $_ -Level $newLevel
        }
    }
}

输出

PS C:\temp\powershell\recursive_tests> get-fileinfile 'C:\temp\powershell\recursive_tests\A1.txt', 'C:\temp\powershell\recursive_tests\B1.txt'

C:\temp\powershell\recursive_tests\A1.txt
        C:\temp\powershell\recursive_tests\A1a.txt
        C:\temp\powershell\recursive_tests\A1b.txt
                C:\temp\powershell\recursive_tests\A1b1.txt
                C:\temp\powershell\recursive_tests\A1b2.txt
                C:\temp\powershell\recursive_tests\A1b3.txt
        C:\temp\powershell\recursive_tests\A1c.txt
C:\temp\powershell\recursive_tests\B1.txt
        C:\temp\powershell\recursive_tests\B1a.txt
                C:\temp\powershell\recursive_tests\B1a1.txt
                C:\temp\powershell\recursive_tests\B1a2.txt
                C:\temp\powershell\recursive_tests\B1a3.txt
        C:\temp\powershell\recursive_tests\B1b.txt
        C:\temp\powershell\recursive_tests\B1c.txt
                C:\temp\powershell\recursive_tests\B1c1.txt
                C:\temp\powershell\recursive_tests\B1c2.txt
                C:\temp\powershell\recursive_tests\B1c3.txt

这里我只传入了2个顶层文件A1.txt和B1.txt。由于所有文件都存在于同一个文件夹中,我不能使用 Get-ChildItem 并且只是 foreach 遍历每个文件或文件将被处理不止一次,首先由我最初调用,然后在子级文件中遇到它们的路径时再次调用,所以相反,我只是传入我知道是根的 2。