Powershell:使用并行文件访问写入日志文件
Powershell: Write Log-file with paralell file access
我试着写一个带有一些调试输出的日志文件。
我的它在顺序运行时运行良好,但是一旦我在更多实例中启动基本应用程序,我就会收到错误消息。
Der Prozess kann nicht auf die Datei zugreifen, da ein anderer Prozess einen Teil der Datei gesperrt 帽子。 : 'B:\Logfiles\Startup.log'
该进程无法访问该文件,因为它被另一个进程锁定。
所以我尝试做一个 do - try - catch 构造来在文件被锁定时重试。
但由于某种原因,这不起作用:(
do{
$Failed = $false
Try{
Write-Output "C:\KFZBooth\Software_remove.bg\AIBackgroundRemove.exe" -ArgumentList '"batch"',`"$Original`",'""',`"$AIAusgabepfad$Originaldatei$Originaltyp`" | Out-file $StartUpLog -append
} catch {
$Failed = $true
Write-Host "RETRY Reduce Credit"
Write-Host $_.Exception.Message
Write-Host $_.Exception.ItemName
Write-Output "Logproblem im Startup.log - RETRY" | Out-file $UsageLog -append
}
} while ($Failed)
是否有更好的写入日志文件或等待文件解锁的方法?
这真的取决于文件类型。例如,如果您使用 MSWord 或其他 MSOffice 文件登录:
运行 下面的代码关闭文件,然后打开文件。
$FileName = 'D:\temp\TestDoc.docx'
Try
{
$FileStream = [System.IO.File]::Open($FileName,'Open','Write')
$FileStream.Close()
$FileStream.Dispose()
($IsLocked = $False)
}
Catch [System.UnauthorizedAccessException] {($IsLocked = 'AccessDenied')}
Catch {($IsLocked = $True)}
文本文件没有这个问题。
然而,为什么要使用文件呢。创建您自己的事件日志并直接写入。
Use PowerShell to Create and to Use a New Event Log
https://devblogs.microsoft.com/scripting/use-powershell-to-create-and-to-use-a-new-event-log/
您是否查看过使用 PowerShell 脚本?
Get-Command -Name '*transcript*' | ft -a
# Results
<#
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Start-Transcript 3.0.0.0 Microsoft.PowerShell.Host
Cmdlet Stop-Transcript 3.0.0.0 Microsoft.PowerShell.Host
#>
# Get specifics for a module, cmdlet, or function
(Get-Command -Name Start-Transcript).Parameters
(Get-Command -Name Start-Transcript).Parameters.Keys
Get-help -Name Start-Transcript -Examples
# Results
<#
Start-Transcript
Start-Transcript -Path "C:\transcripts\transcript0.txt" -NoClobber
#>
Get-help -Name Start-Transcript -Full
Get-help -Name Start-Transcript -Online
我试着写一个带有一些调试输出的日志文件。 我的它在顺序运行时运行良好,但是一旦我在更多实例中启动基本应用程序,我就会收到错误消息。
Der Prozess kann nicht auf die Datei zugreifen, da ein anderer Prozess einen Teil der Datei gesperrt 帽子。 : 'B:\Logfiles\Startup.log' 该进程无法访问该文件,因为它被另一个进程锁定。
所以我尝试做一个 do - try - catch 构造来在文件被锁定时重试。 但由于某种原因,这不起作用:(
do{
$Failed = $false
Try{
Write-Output "C:\KFZBooth\Software_remove.bg\AIBackgroundRemove.exe" -ArgumentList '"batch"',`"$Original`",'""',`"$AIAusgabepfad$Originaldatei$Originaltyp`" | Out-file $StartUpLog -append
} catch {
$Failed = $true
Write-Host "RETRY Reduce Credit"
Write-Host $_.Exception.Message
Write-Host $_.Exception.ItemName
Write-Output "Logproblem im Startup.log - RETRY" | Out-file $UsageLog -append
}
} while ($Failed)
是否有更好的写入日志文件或等待文件解锁的方法?
这真的取决于文件类型。例如,如果您使用 MSWord 或其他 MSOffice 文件登录:
运行 下面的代码关闭文件,然后打开文件。
$FileName = 'D:\temp\TestDoc.docx'
Try
{
$FileStream = [System.IO.File]::Open($FileName,'Open','Write')
$FileStream.Close()
$FileStream.Dispose()
($IsLocked = $False)
}
Catch [System.UnauthorizedAccessException] {($IsLocked = 'AccessDenied')}
Catch {($IsLocked = $True)}
文本文件没有这个问题。
然而,为什么要使用文件呢。创建您自己的事件日志并直接写入。
Use PowerShell to Create and to Use a New Event Log
https://devblogs.microsoft.com/scripting/use-powershell-to-create-and-to-use-a-new-event-log/
您是否查看过使用 PowerShell 脚本?
Get-Command -Name '*transcript*' | ft -a
# Results
<#
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Start-Transcript 3.0.0.0 Microsoft.PowerShell.Host
Cmdlet Stop-Transcript 3.0.0.0 Microsoft.PowerShell.Host
#>
# Get specifics for a module, cmdlet, or function
(Get-Command -Name Start-Transcript).Parameters
(Get-Command -Name Start-Transcript).Parameters.Keys
Get-help -Name Start-Transcript -Examples
# Results
<#
Start-Transcript
Start-Transcript -Path "C:\transcripts\transcript0.txt" -NoClobber
#>
Get-help -Name Start-Transcript -Full
Get-help -Name Start-Transcript -Online