使用打开句柄修改文件

时间:2015-11-24 20:56:24

标签: windows powershell window-handles

我遇到了一个奇怪的问题,文本文件在另一个进程中有一个打开的句柄。如果我在记事本中打开文本文件,我就可以修改数据并将其保存到文件中。但是,我无法删除该文件,它从Windows提供有关在另一个应用程序中打开的文件的标准警告。

我尝试做的是使用PowerShell而不是记事本修改(而不是删除)相同的文件。

所以我通常会使用类似的东西:

$File = "F:\Event Data\Exchange.txt"
(Get-Content $File) -replace ' - TextToBeRemoved ', ' - ' | Set-Content $File

这在PowerShell中引发了错误:

Set-Content : The process cannot access the file 'F:\Event Data\Exchange.txt' because it is being used by another process.

因此,如果我可以通过记事本修改和保存内容,PowerShell中的内容是等效的吗?我宁愿不追捕并杀死开放流程,因为这会导致其他/更大的问题。

我也尝试了同样的结果错误:

(Get-Content $File) | foreach-object {$_ -replace ' - TextToBeRemoved ', ' - '} | Set-Content $File 

这可能无关紧要,但由于案件不一致,我使用-replace而不是.replace,所以我想坚持使用那个或者某些案例中立的东西。

感谢。

1 个答案:

答案 0 :(得分:0)

一种可能性是使用System.IO.FileStream类。您可以在文件中指定所需的任何访问权限。您还可以指定文件模式。或者,如果这不起作用,您可以P / Invoke Win32 CreateFile / ReadFile / WriteFile / CloseFile API。

但正如Harry在评论中指出的那样,你需要弄清楚哪些操作失败了,而过程监控是一个很好的方法。我将过滤powershell进程和失败返回代码。

如果它没有显示任何内容,那么PS因其他原因而失败了。在这种情况下,您只需复制参数即可打开记事本使用的最佳文件,并希望它能正常工作。

最终,大多数用户模式文件都会通过CreateFile打开并在Windows漏斗中创建。如果你进入P / Invoke路线,你可以完全复制记事本的功能。