Powershell FileSystemWatcher - предотвращение дублирования действий при создании - PullRequest
0 голосов
/ 22 мая 2019

Это известная проблема в Powershell, когда FileSystemWatcher дважды запускает события.Я пытаюсь обойти это, поскольку я наблюдаю за созданными файлами, а затем отправляю их на принтер.Двойная стрельба означает, что я получаю дублирующиеся распечатки

Я знаю, что этот вопрос задавался ранее, но я полностью новичок, когда дело доходит до Powershell (и, вообще говоря, от сценариев в целом), поэтому некоторые из ответов пошли прямомоя голова

В коде я наблюдаю за папкой, а затем передаю имена подкаталогов в качестве имени принтера для отправки задания.Это связано с тем, что используемое программное обеспечение копирует PDF-файлы из удаленного расположения в эти папки (программное обеспечение не имеет прямого доступа к принтерам из-за Citrix)

### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO
    $watcher = New-Object System.IO.FileSystemWatcher
    $watcher.Path = "L:\Label\"
    $watcher.Filter = "*.*"
    $watcher.IncludeSubdirectories = $true
    $watcher.EnableRaisingEvents = $true 

### DEFINE ACTIONS AFTER AN EVENT IS DETECTED
    $action = { $path = $Event.SourceEventArgs.FullPath
                $changeType = $Event.SourceEventArgs.ChangeType
                $printer = Split-Path (Split-Path $path -Parent) -Leaf
                $logline = "$(Get-Date), $changeType, $path, $printer"
                Add-content "c:\prog\log.txt" -value $logline
                C:\prog\SumatraPDF.exe -print-to "\\http://srv:631\$printer" $path
              }    

### DECIDE WHICH EVENTS SHOULD BE WATCHED 
    Register-ObjectEvent $watcher "Created" -Action $action
    while ($true) {sleep 5}

Я ожидаю увидеть печатьКоманда (вызов Суматры) появляется только один раз, когда pdf-файл помещается в папку просмотра

1 Ответ

0 голосов
/ 22 мая 2019

Я не думаю, что это известная проблема, что FileSystemWatcher запускается дважды по событиям, а не там, где вы получили эту информацию.

В любом случае, если бы я был вами, я бы сам не кодировал события FileSystemWather в Powershell.Это настоящая боль.

Вместо этого вы можете использовать Powershell Guard, просто передав команду печати вместо TestCommand.https://github.com/smurawski/PowerShellGuard

Все, что делает PowerGuard, это абстрактное использование FileSystemWatcher.Вы можете создать свою команду печати в скрипте Powershell и просто заставить PowerGuard вызывать ваш скрипт с помощью -TestCommand "Print.ps1. \ PathToYourFile"

Окончательное решение (от самого автора):

dir \\srv\label\prnlblCuts\*.pdf | New-Guard -TestCommand "C:\PROG\SumatraPDF.exe -print-to \\srv-tsv:631\prnlblCuts" -TestPath "$($_.FullName)" -Wait
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...