Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell:从文本文件获取数据_Powershell - Fatal编程技术网

Powershell:从文本文件获取数据

Powershell:从文本文件获取数据,powershell,Powershell,大家好, 我正在尝试获取每个组的批准者列表。下面的代码是我正在尝试进行的一些编码的示例 预期产出 有什么线索吗 多谢各位 $file = 'textfile.txt' $groups foreach($line in Get-Content $file){ $Lines = Get-Content $file $Output = For( $i = 0; $i -lt $Lines.Length; ++$i) { If($Line.StartsWith("# APPROVER:

大家好,

我正在尝试获取每个组的批准者列表。下面的代码是我正在尝试进行的一些编码的示例

预期产出

有什么线索吗

多谢各位

$file = 'textfile.txt'
$groups

foreach($line in Get-Content $file){

$Lines = Get-Content $file
$Output = 

For( $i = 0; $i -lt $Lines.Length; ++$i)
{
    If($Line.StartsWith("# APPROVER:"))
    {
        $Lines[$i]
        # Need to ignore lines in between
        :LookForGroup Do
        {
            ++$i
            If( $Lines[$i].StartsWith($groups))
            {
                $Lines[$i]
                ""
                Break LookForGroup
            }
        } While($true)
    }
}
}
$Output

看起来您正在拆分并替换它,以便将文件内容分成单独的行。但是,默认情况下,“获取内容”会执行此操作。此外,在代码中,$line&$content将具有相同的值

我想尝试一下,但我认为您要做的是通过一系列行查找组名,在您发现“批准者”后,这些组名可能会出现在任意点上

我手动键入了一个文件,与您在修改后的问题中演示的内容非常匹配。提出了以下建议。这也是我脑子里想不出来的,但它似乎按照你上面的口述工作

注意:我添加$Groups数组只是为了模拟您在上次评论中所说的内容

$File = 'C:\Temp\InputTest.txt'
$Groups = @( 'Group1','Group2','Group3','Group4','Group5' )

$Lines = Get-Content $File
$Output = 
For( $i = 0; $i -lt $Lines.Length; ++$i )
{
    If( $Lines[$i] -match '^# approver' )
    {
        $Approver = $Lines[$i].split(':').Trim()[1]
        # Need to ignore lines in between
        :LookForGroup Do
        {
            ++$i
            ForEach ( $Group in $Groups )
            {
                If( $Lines[$i] -match "^$Group" )
                {
                    $Approver + ' ' + $Lines[$i]
                    ++$i
                }
                ElseIf( $Lines[$i]  -match "(^$|\r\n|^######)")
                {# Looking for a signal to move on...
                    Remove-Variable Approver #Maybe don't need this???
                    Break LookForGroup
                }
            }
        } While($true)
    }
}
#This will display the output, you can do something else with it...
$Output
我所做的是使用$I,有点像光标。一旦发现一个审批人行,我将遍历每个组,查看该行是否与组名匹配。如果匹配,我将按照您的指定输出审批人和组名。然后我增加$I,从而在文件中向前移动一行。如果行与组不匹配,我会检查一些特征,看看我们是否到达了一个部分的末尾(如您的示例所定义)。如果是,我将中断Do循环,这将导致For循环继续,注意:$I将保留为我们设置的值


我承认这是一个小麻烦让我知道…

请不要添加文本作为图像链接,而是将它们作为格式化文本插入问题。当然,你有解决方案吗?输入太乱了。你如何决定什么是有效的组名,什么不是?嗨,西奥,输入已经编辑。嗨,史蒂夫,谢谢你的努力。我知道你在这件事上花了很多时间。不幸的是,上面的代码没有给我任何解决方案,我不知道为什么。我将用一些额外的图片重新编辑上面的代码并再次共享。请注意,我已经将我的组名保存在$group中。因此,我想使用Startswith运算符而不是match/eq。请查看上述代码并提出建议。谢谢我修改了答案以便更好地匹配你的描述。。。让我知道。。。注意:我之所以使用-match,是因为.StartsWith()区分大小写,与使用.ToLower()之类的东西进行规范化类似……嗨,史蒂文,谢谢你的努力。代码似乎运行良好。我得到的唯一问题是,有比我得到的结果更多的组。除此之外,数据和代码是正确的。请让我知道我们是否可以做出任何改进。如果没有真正的输入文件,我很难进一步改进。就像我说的,这个练习真的是我脑子里想不出来的。我想如果文件不完美。。。也许有些团体没有批准人;除非你能在某一点上依赖于模式,否则逻辑将失败。在这种非结构化的情况下,您必须了解您的输入,并对发现的每个异常进行代码调整。如果还有什么我能做的,请告诉我。谢谢。目的是寻找一个信号,我不需要继续寻找团体。由于没有真正的输入,再次受到部分抑制;正则表达式用于匹配一个空行或一整串哈希符号(因为审批人行也以哈希开头)。