如何匹配powershell脚本中文本文件内容的每一行

时间:2018-06-05 10:13:45

标签: powershell powershell-v2.0

我有一个文本文件'abc.txt',其中包含以下内容 hello_1
hello_2
..
..
hello_n

我需要编写一个脚本来打开文件abc.txt并读取每一行并将每行存储在名为$ temp的变量中。我只需要读取以'hello'开头的行。以下代码有什么问题?
我有以下代码:

foreach ($line in Get-Content "c:\folder\abc.txt")    
{    
    if($line Select-String -Pattern 'hello')
    $temp=$line
}

2 个答案:

答案 0 :(得分:1)

您在$line之后缺少管道,并且在{后整个脚本块}foreach中缺少花括号,应该是:

foreach ($line in Get-Content "c:\folder\abc.txt")    
{    
    {
    if($line | Select-String -Pattern 'hello')
    $temp=$line
    }
}

另外,我不知道你的目的是什么,但如果你想要$line每次你应该在iterration之外创建一个数组并且每次填充它时都不会被覆盖:

首先是:$line = @()而不是$temp=$line更改为$temp += $line

但是,如果您的所有目的都是从文本文件中过滤hello字符串,那么这应该就足够了:

$temp = (Get-Content "c:\folder\abc.txt") -match '^hello'

答案 1 :(得分:1)

试试这个 -

$temp = @()
(Get-Content "c:\folder\abc.txt") | % {$temp += $_ | Select-String -Pattern "hello"}
$temp

代码获取abc.txt的内容,并为每个对象检查模式是否与hello匹配。如果匹配,则将相应的值存储在定义为$temp的数组中。

您可以像这样重写原始代码 -

$temp = @()
foreach ($line in Get-Content "c:\folder\abc.txt")    
{    
    if($line | Select-String -Pattern 'hello') {
    $temp += line
    }
}

在原始代码中,您在语句if($line Select-String -Pattern 'hello')中缺少pipeline。并且您缺少braces {}来包含if语句。