我想定义一个HereString,然后逐行使用它。最初,我认为这些线条在HereString中是与生俱来的,所以我可以使用foreach ($line in $hereString),而当这种方法不起作用时,我尝试了Get-Content $hereString。在这两种情况下都没有joy。目标只是处理一些代码,这些代码最终将操作整个文本文件,因此在实现这个过程中,我可以快速转换为使用一个小示例文本文件,但现在我很好奇,HereStrings是否甚至可以逐行工作,而不以某种方式分裂。
发布于 2017-01-21 13:01:13
由于您的目的是使用它来处理文件,所以我从下面这样的内容开始:
$file = 'c:\testfiles\testfile1.txt'
$textdata =
@'
Line1
Line2
Line3
'@
$textdata | Set-Content $file
$lines = Get-Content $file
foreach ($line in $lines) {}现在,您将在生产中使用的相同环境中进行测试,您可以试验不同的I/O方法以及不同的数据解析和操作方法。从性能的角度来看,了解如何做到这一点将变得更加重要,因为所涉及的文件的大小和数量都在上升。
发布于 2017-01-21 11:54:09
作为PetSerAl建议,最简单的解决方案可能是使用运算符
foreach($line in $herestring -split '\r?\n')
{
# process $line here
}使用模式\r?\n将匹配\r\n (Windows样式换行符)和\n (Unix样式换行符)。
发布于 2017-01-22 02:07:40
请注意,“拆分”和“ForEach”都会导致在开始处理之前首先解析整个文件。如果文件非常大,则在开始处理之前会出现延迟,并且内存可能会引起关注。
另一种选择来自.NET,以极端的形式出现.
$rdr = new-object System.IO.StreamReader('c:\path\to\file.txt')
while (!$rdr.EndOfStream) {
$line = $rdr.ReadLine()
## do processing on the line ##
}在上面,每次调用StreamReader的StreamReader方法时,它都会前进到下一行。上面的内容是最有效的,如果发现文件中不喜欢的东西,您就有机会提前爆发。
您可以查看StreamReader在这里的细节。
https://stackoverflow.com/questions/41778508
复制相似问题