2014-01-30 58 views
0

我遇到IO.FileSystemWatcher问题。我有一个脚本,当文件复制到某个目录时,它会处理该文件并将其复制到网络上的另一个文件夹中。但是有一个问题,一旦fsw触发oncreate事件就会开始复制,这会产生一个错误(文件已打开),我希望它只在文件完成复制后才能启动。重命名和删除工作正常。 cloud.ps1是处理文件并将其复制的脚本。 这是监控脚本代码:Powershell:文件完成复制后执行脚本

$watch = '\\HR-ZAG-SR-0011\ACO\ACO2\99. BOX' 
$watcher = New-Object System.IO.FileSystemWatcher 
$watcher.Path = $watch 
$watcher.IncludeSubdirectories = $true 
$watcher.EnableRaisingEvents = $true 

$changed = Register-ObjectEvent $watcher "Changed" -Action { 
# Write-Host "Changed: $($eventArgs.ChangeType)" 
# $watch\cloud.ps1 modify "$($eventArgs.FullPath)" 
} 
$created = Register-ObjectEvent $watcher "Created" -Action { 
    Write-Host "Created: $($eventArgs.FullPath)" 
    .\cloud.ps1 create "$($eventArgs.FullPath)" 
} 
$deleted = Register-ObjectEvent $watcher "Deleted" -Action { 
    Write-Host "Deleted: $($eventArgs.FullPath)" 
    .\cloud.ps1 delete "$($eventArgs.FullPath)" 
} 
$renamed = Register-ObjectEvent $watcher "Renamed" -Action { 
    Write-Host "Renamed: $($eventArgs.OldFullPath) to $($eventArgs.FullPath)" 
    .\cloud.ps1 rename "$($eventArgs.OldFullPath)" "$($eventArgs.FullPath)" 
} 

回答

1

你可以把一个循环开始检查,看看是否可以获取有关文件的写锁:

While ($True) 
{ 
    Try { 
     [IO.File]::OpenWrite($file).Close() 
     Break 
     } 
    Catch { Start-Sleep -Seconds 1 } 
} 

只要文件正在写入,您将无法获得写入锁定,并且尝试将失败。一旦写入完成并且文件关闭,OpenWrite将会成功,循环将会中断,您可以继续复制文件。