我得到以下异常:
进程无法访问该文件,因为它正被另一个进程使用
我想简单地清除通过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
试图写入现有文件(因此打开的读句柄不会影响这一点)