【问题标题】:PowerShell locking FilePowerShell 锁定文件
【发布时间】:2020-02-10 06:53:42
【问题描述】:

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

  1. 读取文件内容
  2. 处理一些字符串
  3. 将修改后的测试保存回文件

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

我也试过Set-Content

我总是得到未经授权的异常。我可以看到$file 有文件内容,写入文件时出现错误。

我该如何解决这个问题?

【问题讨论】:

  • 此操作是否对所有文件或仅针对该文件或该路径中的文件失败?

标签: powershell


【解决方案1】:

这可能是由获得读取锁定的Get-Content cmdlet 和尝试获得写入锁定的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,在此期间将需要写锁)。

【讨论】:

  • 成功了。谢谢。现在我觉得问这个很愚蠢:)但是谢谢。我确实读过这方面的内容,但由于我在一个语句中传递了所有内容,它给了我错误,因为锁没有被释放。酷!!
  • 我不明白解决方案 - 我通过[xml]$file = Get-Content $filename 有一个 xml 文件,当我在读取文件后尝试删除该文件时,出现锁定错误。 XmlDocument 上没有 dispose 方法,并且 nulling $file 不起作用,所以我不确定如何继续。
  • 也许变量应该是'xml'[xml]$xml = Get-Content $filename。所以很明显,它不是文件,而是代表xml的对象。 Remove-Item $filename 删除文件。
【解决方案2】:

如果我有一个文件操作,接受的答案对我有用,但是当我对同一个文件执行多个 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

【讨论】:

    【解决方案3】:

    个人经历:我在其中一个程序中出现了“锁定文件综合症”。我发现它是由文件上的新对象分配引起的。我意识到我没有对对象发出“Dispose()”调用。我重写了有问题的代码以尽快处理“新对象”,并解决了“锁定文件”综合症。 对我来说是一个学习活动 = 总是处理每个新对象!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 2016-11-07
      相关资源
      最近更新 更多