0
我有以下代码来检测创建新文件并获取它的副本。在创建时复制文件(完成后)
$folder = '\\server\share\monitor_me\'
$filter = '*.*'
$copyToFolder = 'C:\temp\capture\'
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{IncludeSubdirectories = $true;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}
#protection from previous runs
unregister-event -SourceIdentifier FileCreated -ErrorAction SilentlyContinue
Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
$name = $Event.SourceEventArgs.Name
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
Write-Host "The file '$name' was $changeType at $timeStamp" -fore green
Copy-Item -Path $Event.SourceEventArgs.FullPath -Destination $copyToFolder
}
测试符合本规则的并行会话:
1..1000 `
| %{new-object -TypeName pscustomobject -Property @{Id=$_;Name="hi"} } `
| export-csv '\\server\share\monitor_me\test.csv'
...显示,代码完成工作;但在文件出现的时候捕获该文件,而不是等待文件完全填充,因此我只获取一些生成的文件内容。
我可以添加start-sleep
声明;但那会导致竞争条件。
我认为在写入文件时会锁定文件(即阻止其他进程更新同一文件;但不影响文件的读取/复制),因此理想情况下希望有一些方法可以等待直到该锁被删除。
- 我假设
export-csv
过程存在文件锁定正确吗? - 有没有办法检测锁何时被移除?
在此先感谢