Powershell:在文件复制完成后执行脚本

Powershell:在文件复制完成后执行脚本,powershell,file-io,filesystemwatcher,Powershell,File Io,Filesystemwatcher,我与IO.FileSystemWatcher有问题。我有一个脚本,当文件复制到某个目录时,它会处理该文件并将其复制到网络上的另一个文件夹。但有一个问题,它会在fsw触发oncreate事件后立即开始复制,这会生成一个错误(文件已打开),我希望它仅在文件复制完成后才开始。重命名和删除可以正常工作。 cloud.ps1是处理并复制文件的脚本。 这是监视器脚本的代码: $watch = '\\HR-ZAG-SR-0011\ACO\ACO2\99. BOX' $watcher = New-Object

我与IO.FileSystemWatcher有问题。我有一个脚本,当文件复制到某个目录时,它会处理该文件并将其复制到网络上的另一个文件夹。但有一个问题,它会在fsw触发oncreate事件后立即开始复制,这会生成一个错误(文件已打开),我希望它仅在文件复制完成后才开始。重命名和删除可以正常工作。 cloud.ps1是处理并复制文件的脚本。 这是监视器脚本的代码:

$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)"
}

您可以放入一个循环,开始检查是否可以获得文件的写锁:

While ($True)
 {
   Try { 
         [IO.File]::OpenWrite($file).Close() 
         Break
       }
   Catch { Start-Sleep -Seconds 1 }
 }
只要文件被写入,您就无法获得写锁,尝试就会失败。一旦写入完成并关闭文件,OpenWrite将成功,循环将中断,您可以继续复制文件