删除/清除其他进程使用的打开的文本文件



我得到以下异常:

进程无法访问该文件,因为它正被另一个进程使用

我想简单地清除通过PowerShell打开的日志文件。如下所示:

$path = ...
Clear-Content $path -Force

即使文件已打开,我如何才能做到这一点Windows编辑器Notepad++可以在日志查看器打开文件时执行此操作,但我无法在PowerShell中执行此操作。编辑们是怎么做到的?我也可以通过PowerShell以某种方式实现这一点吗?

我还尝试了Set-Content来清除文件的内容,得到了相同的结果。

编辑-设置

  • 我的程序写入日志文件(始终没有问题,即使打开了日志查看器)
  • 我使用glogg作为日志查看器(http://glogg.bonnefon.org/)
  • 如果打开glogg,Powershell脚本将失败
  • 我可以可靠地复制这一点,并且可以看到,Notepad++和Windows编辑器可以轻松地始终覆盖文件内容(当然,我的应用程序仍然能够写入日志文件),并且glogg立即显示新的日志文件内容

编辑2:ProcMon数据

案例1-Glogg被打开,powershell失败

11:11:12,1441593    powershell.exe  10304   QueryOpen   D:VW_LOG.txt   SUCCESS CreationTime: 16.10.2014 09:59:18, LastAccessTime: 16.10.2014 10:13:51, LastWriteTime: 13.10.2017 10:22:07, ChangeTime: 13.10.2017 10:22:07, AllocationSize: 28.672, EndOfFile: 26.451, FileAttributes: A
11:11:12,1442828    powershell.exe  10304   CreateFile  D:VW_LOG.txt   SHARING VIOLATION   Desired Access: Generic Write, Read Attributes, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Open No Recall, Attributes: n/a, ShareMode: Write, AllocationSize: n/a

案例2-Glogg关闭,powershell成功

11:12:48,9053637    powershell.exe  10304   QueryOpen   D:VW_LOG.txt   SUCCESS CreationTime: 16.10.2014 09:59:18, LastAccessTime: 16.10.2014 10:13:51, LastWriteTime: 13.10.2017 10:22:07, ChangeTime: 13.10.2017 10:22:07, AllocationSize: 28.672, EndOfFile: 26.451, FileAttributes: A
11:12:48,9055053    powershell.exe  10304   CreateFile  D:VW_LOG.txt   SUCCESS Desired Access: Generic Write, Read Attributes, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Open No Recall, Attributes: n/a, ShareMode: Write, AllocationSize: n/a, OpenResult: Opened
11:12:48,9055581    powershell.exe  10304   QuerySecurityFile   D:VW_LOG.txt   SUCCESS Information: Attribute
11:12:48,9055808    powershell.exe  10304   SetAllocationInformationFile    D:VW_LOG.txt   SUCCESS AllocationSize: 0
11:12:48,9058881    powershell.exe  10304   CloseFile   D:VW_LOG.txt   SUCCESS 

EDIT 3-工作替代解决方案

我在我的powershell脚本中调用以下内容,它运行得非常完美:

ExecuteSimpleBatch "clear_file.bat" $path
function ExecuteSimpleBatch($file, $par)
{
$fileName = Split-Path $file -leaf
$fileFolder = Split-Path $file -parent
Start-Process "cmd" -ArgumentList '/c', $file, $par -WorkingDirectory $fileFolder -WindowStyle hidden
}

"clear_file.bat"的内容:

break > %1

最后我找到了一个可行的解决方案:

代替

Clear-Content $path

可以使用

"" | Out-File $path -NoNewline -Encoding ASCII

为什么

看起来Clear-Content正在创建一个新文件并用它替换旧文件,而Out-File试图写入现有文件(因此打开的读句柄不会影响这一点)

最新更新