powershell - 使用 StreamWriter() 写入与 StreamReader() 相同的文件

标签 powershell

我想在多个文件中查找并替换某个字符串。其中一些文件可能相对较大,因此我使用了 System.IO 命名空间中的 StreamReader 类。

我遇到的问题是我不想将新值写入新文件(这是我目前拥有的文件)。我只想“更新”当前文件。

$currentValue = "B";
$newValue = "A";

# Loop through all of the directories and update with new details. 
foreach ($file in $Directories) {
    $streamReader = New-Object System.IO.StreamReader -Arg "$file"
    $streamWriter = [System.IO.StreamWriter] "$file"
    # Switching $streamWriter to the below works.
    # $streamWriter = [System.IO.StreamWriter] "C:\Temp\newFile.txt"

    while($line = $streamReader.ReadLine()){
        # Write-Output "Current line value is $line";
        $s = $line -replace "$currentValue", "$newValue"
        # Write-Output "The new line value is $s"
        $streamWriter.WriteLine($s);
    }

    # Close the streams ready for the next loop.
    $streamReader.close();
    $streamWriter.close();
}

Write-Output "The task has complete."

有谁知道我该怎么做?

最佳答案

您不能同时读取和写入同一个文件。不适用于 StreamReaderStreamWriter,也不适用于任何其他常用方法。如果您需要修改现有文件并且不能(或不想)将其全部内容读入内存,您必须将修改后的内容写入一个临时文件,然后用关闭两个文件后的临时文件。

例子:

$filename = (Get-Item $file).Name

$streamReader = New-Object IO.StreamReader -Arg $file
$streamWriter = [System.IO.StreamWriter] "$file.tmp"

...

$streamReader.Close(); $streamReader.Dispose()
$streamWriter.Close(); $streamWriter.Dispose()

Remove-Item $file -Force
Rename-Item "$file.tmp" -NewName $filename

关于powershell - 使用 StreamWriter() 写入与 StreamReader() 相同的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34853307/

相关文章:

shell - 可以将命令别名自动添加到DOS shell中吗?

windows - 获取代表本地系统内置帐户的 PSCredential 实例

powershell - 包含自定义 cmdlet 的 Start-Job 因奇怪错误而终止

powershell - 将证书从驱动程序导入到 TrustedPublisher 以进行静默驱动程序安装

powershell - 保留x个目录并删除所有其他目录,每次都需要排除一个目录及其内容

powershell - 在不使用 ActiveDirectory 模块的情况下在 powershell 中获取当前计算机的可分辨名称

sql-server - invoke-sqlcmd 失败显示某些类型的查询没有结果

powershell - 是否可以异步更新 PowerShell 提示符?

Azure ARM - 具有 ARM 模板的基线资源

powershell - 哈希表中的解释点