PowerShell锁定文件

6

我在PowerShell中尝试做一些非常简单的事情。

  1. Reading the contents of a file
  2. Manipulation some string
  3. Saving the modified test back to the file

    function Replace {
      $file = Get-Content C:\Path\File.cs
      $file | foreach {$_ -replace "document.getElementById", "$"} |out-file -filepath C:\Path\File.cs
    }
    

我也尝试过使用 Set-Content

但是每次都会出现未授权的异常。我可以看到 $file 里有文件内容,但在写入文件时出现了错误。

我该怎么解决这个问题?


这个失败是针对所有文件还是只有那一个或者在那个路径下? - Preet Sangha
3个回答

6
这很可能是由于Get-Content命令获取了读取锁,而Out-File尝试获取其写入锁所致。类似的问题在这里:Powershell: how do you read & write I/O within one pipeline? 因此,解决方案如下:
${C:\Path\File.cs} = ${C:\Path\File.cs} | foreach {$_ -replace "document.getElementById", '$'}
${C:\Path\File.cs} = Get-Content C:\Path\File.cs | foreach {$_ -replace  "document.getElementById", '$'}

$content = Get-Content C:\Path\File.cs | foreach {$_ -replace "document.getElementById", '$'}
$content | Set-Content C:\Path\File.cs

基本上你需要缓冲文件的内容,以便可以关闭文件(用于读取的Get-Content),之后应将缓冲器刷新到文件中(使用Set-Content,在此期间需要写锁)。


它起作用了。谢谢。现在我感到很愚蠢,因为我问了这个问题 :) 但还是谢谢。我确实读过这个,但由于我将所有内容都放在一个语句中,所以它给了我一个错误,因为锁没有被释放。太棒了!! - Ben
我不理解这个解决方案 - 我通过 [xml]$file = Get-Content $filename 获取了一个 xml 文件,但在尝试读取后删除该文件时,出现了锁定错误。XmlDocument 上没有 dispose 方法,将 $file 置为 null 也不起作用,所以我不确定该如何继续下去。 - PeterX
也许变量应该是 'xml' [xml]$xml = Get-Content $filename。这样就清楚了,它不是文件,而是代表 xml 的对象。Remove-Item $filename会删除该文件。 - stej

1

如果我只有一个文件操作,那么接受的答案对我有用,但是当我在同一文件上执行多个Set-Content或Add-Content操作时,仍然会出现“正在被另一个进程使用”的错误。

最终,我不得不先写入临时文件,然后将临时文件复制到原始文件:

(Get-Content C:\Path\File.cs) | foreach {$_ -replace "document.getElementById", '$'} | Set-Content C:\Path\File.cs.temp
Copy-Item C:\Path\File.cs.temp C:\Path\File.cs

0
个人经验:在我的一个程序中,我遇到了“文件锁定综合症”。我发现这是由于文件上的New-Object分配引起的。我意识到我没有对该对象发出“Dispose()”调用。我重写有问题的代码,以便在方便的时候处理“New-Object”,结果“锁定文件”综合症得以解决。 对我来说,这是一次学习事件=始终处置每个New-Object!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接