我是Windows PowerShell的新手。我试图在4次上执行查找和替换字符串。但即使是简单的查找和替换也会抛出一个
类型的异常' System.OutOfMemoryException'被扔了。
错误。我使用了Get-content
有没有办法在不破坏记忆的情况下实现它?
e.g。替换" .000000000Z"用" .732Z"其中732将是作业运行的毫秒数?
PSversion:3.0
答案 0 :(得分:1)
典型的方法是使用.Net方法逐行完成。
假设你有明智的换行符,你可以这样做:
$FilePath = '...';
$NewFilePath = '...';
$Reader = New-Object -TypeName System.IO.StreamReader -ArgumentList $FilePath;
$Writer = New-Object -TypeName System.IO.StreamWriter -ArgumentList $NewFilePath;
while (($Line = $Reader.ReadLine()) -ne $null) {
$Writer.WriteLine($Line.Replace('.000000000Z','.732Z'));
}
$Reader.Close();
$Writer.Close();
如果您的XML文件是单行文本,则会变得更复杂。
答案 1 :(得分:1)
Get-Content将整个文件内容加载到RAM中以进行操作。
您需要升级RAM 使用不同的方法,其中有一些。
Get-Content
Get-Content -Raw
Get-Content -ReadCount
Switch -File
.Net阅读器是最理想的
[System.IO.File]::ReadAllText()
[System.IO.File]::ReadAllLines()
[System.IO.File]::ReadLines()
[System.IO.File]::OpenText().readtoend()
System.IO.File.ReadLines()很可能是你最好的选择,因为它返回文件的所有行,但是让你开始迭代直接行,这意味着它不必存储整个内容记忆。 更多详情:https://msdn.microsoft.com/en-us/library/dd383503.aspx
Requires .NET 4.0 or higher.
foreach ($line in [System.IO.File]::ReadLines($filename)) {
# do something with $line
}
所以,你可以这样做......
$reader = [System.IO.File]::OpenText("my.log")
try {
for() {
$line = $reader.ReadLine()
if ($line -eq $null) { break }
# process the line
$line
}
}
finally {
$reader.Close()
}
或者缩短它......
$reader = [System.IO.File]::OpenText("my.log")
while($null -ne ($line = $reader.ReadLine())) {
$line
}