System.IO.FileSystemWatcher сработал только один раз - PullRequest
0 голосов
/ 18 апреля 2019

Требуется следующее

  • Через FTP-клиент пользователь загружает файл на FTP-сервер
  • После того, как файл скопирован, нам нужно обработать его и вызвать пакетный файл
  • После завершения будет ждать другой файл

Ниже сценарий работает нормально для одного файла, но для следующего файла, событие не запускается.

### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "C:\folder\xmls"
$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:\folder\Log_" +  $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:\folder\import.bat' -ArgumentList @('"' + $path + '"') -Wait

    $logline = "$(Get-Date), MLCP process completed"
    Add-Content -Path $logFile -Value $logline

    $destinationPath = "C:\folder\ProcessedXmls"
    ###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:\folder\UploadStatustoBlob.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, оно будет работать для 1-го файла.

Затем мне нужно добавить это в планировщик задач Windows для непрерывной работы.

Я не уверен, чего мне здесь не хватает

1 Ответ

1 голос
/ 19 апреля 2019

Возвращаясь к чему-то более минимальному, это работает без Пока.

$Source = 'E:\Temp\folder\xmls'
$Filter = '*.*'
$destination = 'E:\Temp\Folder\ProcessedXmls'

$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:\Temp\folder\xmls\New Text Document.txt Destination: E:\Temp\Folder\ProcessedXmls\New Text Document.txt".
VERBOSE: Performing the operation "Move File" on target "Item: E:\Temp\folder\xmls\New Text Document - Copy.txt Destination: E:\Temp\Folder\ProcessedXmls\New TextDocument - Copy.txt".
VERBOSE: Performing the operation "Move File" on target "Item: E:\Temp\folder\xmls\New Bitmap Image.bmp Destination: E:\Temp\Folder\ProcessedXmls\New Bitmap Image.bmp".

Как и добавление голого минимума, который я мог бы проверить на своем конце.

$Source = 'E:\Temp\folder\xmls'
$Filter = '*.*'
$destination = 'E:\Temp\Folder\ProcessedXmls'

$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:\Temp\folder\Log_" +  $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:\Temp\folder\xmls\New Text Document.txt
04/19/2019 00:40:12, File moved to processed folder
04/19/2019 00:40:28, , E:\Temp\folder\xmls\New Text Document - Copy.txt
04/19/2019 00:40:28, File moved to processed folder
04/19/2019 00:40:46, , E:\Temp\folder\xmls\New Bitmap Image.bmp
04/19/2019 00:40:46, File moved to processed folder

Кроме того,сон на самом деле не нужен.Конечно, ходы выполняются немедленно, если вы не установили это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...