我正在尝试从 %% 开始的输入文件中获取所有行,并使用powershell将其粘贴到输出文件中。
使用以下代码,但是我只获取输出文件中的最后一行,以 %% 开头,而不是以 %% 开头的所有行。
我刚刚开始学习powershell,请帮忙
$Clause = Get-Content "Input File location"
$Outvalue = $Clause | Foreach {
if ($_ -ilike "*%%*")
{
Set-Content "Output file location" $_
}
}
答案 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();