【问题标题】:Copy File On Creation (once complete)创建时复制文件(完成后)
【发布时间】:2016-03-01 17:10:22
【问题描述】:

我有以下代码来检测新文件的创建并获取它的副本。

$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 声明;但这会导致竞争条件。

我假设文件在被写入时被锁定(即阻止其他进程更新同一个文件;但不影响文件的读取/复制),所以理想情况下希望有一些方法等到那个锁被移除了。

  • 我对@9​​87654324@ 进程的文件锁定的假设是否正确?
  • 有没有办法检测锁何时被移除?

提前致谢

【问题讨论】:

    标签: powershell filesystemwatcher powershell-4.0


    【解决方案1】:

    通过将监控的事件更改为 CHANGED 来解决。在初始创建之后似乎发生了 2 个更改事件。为简单起见,我只监视任何更改事件(从而确保我将始终拥有最新副本)并包含 -Force 参数以允许覆盖目标文件。

    Register-ObjectEvent $fsw Changed -SourceIdentifier FileUpdated -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 -Force
    }
    

    注意:我不能 100% 确定这是否会捕获所有新文件;因为可能有某种方法可以在不触发更改事件的情况下创建文件(即我没有找到任何文档说这种情况不存在);但对于我目前的用途来说似乎已经足够了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-02
      • 2011-04-12
      • 1970-01-01
      • 2012-09-26
      • 2011-10-06
      • 2016-02-22
      • 2012-09-19
      • 2020-09-09
      相关资源
      最近更新 更多