System.IO.FileSystemWatcher 只触发一次



要求如下

    通过FTP
  • 客户端,用户将在FTP服务器上上传文件
  • 复制文件后,我们需要处理它并调用批处理文件
  • 完成后,将等待另一个文件

下面的脚本对于一个文件运行良好,但对于下一个文件,不会触发任何操作事件。

### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "C:folderxmls"
$watcher.Filter = "*.*"
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true
### DEFINE ACTIONS AFTER A EVENT IS DETECTED
$action = {
    $path = $Event.SourceEventArgs.FullPath
    ### Sleep for 30 seconds
    Start-Sleep -s 30
    $changeType = $Event.SourceEventArgs.ChangeType
    $date = Get-Date
    $logFile = "C:folderLog_" +  $date.ToString("yyyyMMdd") + ".txt"
    $logline = "$(Get-Date), $changeType, $path"
    Add-Content -Path $logFile -Value $logline
    $logline = "$(Get-Date), MLCP process started"
    Add-Content -Path $logFile -Value $logline
    Start-Process -FilePath 'C:folderimport.bat' -ArgumentList @('"' + $path + '"') -Wait
    $logline = "$(Get-Date), MLCP process completed"
    Add-Content -Path $logFile -Value $logline
    $destinationPath = "C:folderProcessedXmls"
    ###Copy file to processed folder
    Move-Item -Path $path -Destination $destinationPath -Force
    $logline = "$(Get-Date), File moved to processed folder"
    Add-Content -Path $logFile -Value $logline
    $logline = "$(Get-Date), Call Upload script"
    Add-Content -Path $logFile -Value $logline
    $scriptToRun = "C:folderUploadStatustoBlob.ps1"
    &$scriptToRun
    Log($logFile, "Upload script completed from function")
    $logline = "$(Get-Date), Upload script completed"
    Add-Content -Path $logFile -Value $logline
}
### DECIDE WHICH EVENTS SHOULD BE WATCHED + SET CHECK FREQUENCY
$created = Register-ObjectEvent $watcher Created -Action $action
while ($true) {sleep 1}

如果我再次重新启动PowerShell桌面应用程序,它适用于第一个文件。

然后,我需要将其添加到Windows任务计划程序以连续运行。

不确定我在这里错过了什么?

回到更简约的东西,这在没有 While 的情况下工作。

$Source = 'E:Tempfolderxmls'
$Filter = '*.*'
$destination = 'E:TempFolderProcessedXmls'
$Watcher = New-Object IO.FileSystemWatcher $Source, $filter -Property @{
    IncludeSubdirectories = $true
    NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
}
$onCreated = Register-ObjectEvent $Watcher Created -SourceIdentifier FileCreated -Action {
    Start-Sleep -Seconds 3
    $Path = $Event.SourceEventArgs.FullPath
    Move-Item $Path -Destination $destination -verbose
}

# Results    
VERBOSE: Performing the operation "Move File" on target "Item: E:TempfolderxmlsNew Text Document.txt Destination: E:TempFolderProcessedXmlsNew Text Document.txt".
VERBOSE: Performing the operation "Move File" on target "Item: E:TempfolderxmlsNew Text Document - Copy.txt Destination: E:TempFolderProcessedXmlsNew TextDocument - Copy.txt".
VERBOSE: Performing the operation "Move File" on target "Item: E:TempfolderxmlsNew Bitmap Image.bmp Destination: E:TempFolderProcessedXmlsNew Bitmap Image.bmp".

添加我可以验证的最低限度也是如此。

$Source = 'E:Tempfolderxmls'
$Filter = '*.*'
$destination = 'E:TempFolderProcessedXmls'
$Watcher = New-Object IO.FileSystemWatcher $Source, $filter -Property @{
 IncludeSubdirectories = $true
 NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
}
$onCreated = Register-ObjectEvent $Watcher Created -SourceIdentifier FileCreated -Action {
    Start-Sleep -Seconds 3
    $Path = $Event.SourceEventArgs.FullPath
    $date = Get-Date
    $logFile = "E:TempfolderLog_" +  $date.ToString("yyyyMMdd") + ".txt"
    $logline = "$(Get-Date), $changeType, $path"
    Add-Content -Path $logFile -Value $logline
    Move-Item $Path -Destination $destination -verbose
    $logline = "$(Get-Date), File moved to processed folder"
    Add-Content -Path $logFile -Value $logline
}
# Log file content --- Log_20190419.txt
04/19/2019 00:40:12, , E:TempfolderxmlsNew Text Document.txt
04/19/2019 00:40:12, File moved to processed folder
04/19/2019 00:40:28, , E:TempfolderxmlsNew Text Document - Copy.txt
04/19/2019 00:40:28, File moved to processed folder
04/19/2019 00:40:46, , E:TempfolderxmlsNew Bitmap Image.bmp
04/19/2019 00:40:46, File moved to processed folder

此外,睡眠并不是真正需要的。当然,如果您不设置,移动是立即的。

最新更新