使用powershell将特定行从文本文件复制到单独的文件

时间:2016-12-07 06:04:15

标签: powershell

我正在尝试从 %% 开始的输入文件中获取所有行,并使用powershell将其粘贴到输出文件中。

使用以下代码,但是我只获取输出文件中的最后一行,以 %% 开头,而不是以 %% 开头的所有行。

我刚刚开始学习powershell,请帮忙

$Clause = Get-Content "Input File location"
$Outvalue = $Clause | Foreach { 
    if ($_ -ilike "*%%*")
    {
        Set-Content "Output file location" $_
    }
}

2 个答案:

答案 0 :(得分:0)

您正在循环文件中的行,并将每个行设置为文件的整个内容,每次都覆盖以前的文件。

您需要切换为使用Add-Content而非Set-Content,这将附加到文件,或将设计更改为:

Get-Content "input.txt" | Foreach-Object { 
    if ($_ -like "%%*") 
    {
        $_     # just putting this on its own, sends it on out of the pipeline
    }
} | Set-Content Output.txt

您通常会将其写为:

Get-Content "input.txt" | Where-Object { $_ -like "%%*" } | Set-Content Output.txt

在shell中,您可以写为

gc input.txt |? {$_ -like "%%*"} | sc output.txt

过滤整个文件,然后将所有匹配的行一次性发送到Set-Content,而不是为每行单独调用Set-Content。

NB。默认情况下,PowerShell不区分大小写,因此-like-ilike的行为相同。

答案 1 :(得分:0)

对于一个小文件,Get-Content很不错。但是,如果您开始尝试对较重的文件执行此操作,则Get-Content会占用您的内存,并使您无法正常工作。

对于其他Powershell入门者来说,保持它的确非常简单,您将得到更好的覆盖(并具有更好的性能)。因此,像这样的事情就可以完成工作:

$inputfile = "C:\Users\JohnnyC\Desktop\inputfile.txt"
$outputfile = "C:\Users\JohnnyC\Desktop\outputfile.txt"

$reader = [io.file]::OpenText($inputfile)
$writer = [io.file]::CreateText($outputfile)

while($reader.EndOfStream -ne $true) {
    $line = $reader.Readline()
    if ($line -like '%%*') {
        $writer.WriteLine($line);
    }
}

$writer.Dispose();
$reader.Dispose();