文本文件的递归循环以找到最低级别
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。
我有一些文本文件,基本上称为作业,其中一个作业可以包含另一个作业或一系列作业,其中可以包含另一个作业或一系列作业,等等...本质上调用它包含的作业。
我们的想法是遍历最顶层的文件,进入下一个较低的文件等等,直到我们到达“最低层”。
我目前使用的脚本是循环,循环中,循环中。如果我需要进一步向下,我需要添加另一个循环。在此示例中,我们忽略其中包含“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。