Есть ли способ вернуть информацию о / из Powershell File-Watcher, которая была запущена? - PullRequest
2 голосов
/ 22 мая 2019

Сводка ситуации

В настоящее время у меня есть две отдельные консоли Powershell (PS), каждая со своим Filewatcher (FW), наблюдающим за созданным файлом (txt-файлом) из каждой сборки.Код практически идентичен, за исключением фильтра уведомлений.Оба в настоящее время вызывают один и тот же сценарий для запуска тестов.У меня есть 2 набора журналов (вывод добавлен в текстовый файл), которые приходят в результате запуска FW, один журнал для сценария TestPS, а другой - результаты теста, откачанные через приглашение CMD (тесты используютSelenium Webdriver).Скрипт TestPS не определяет, какие тесты запускать, но я не могу записать, какой из них был вызван из-за передачи обслуживания от FW к TestPS.Я знаю только, какой из них был вызван из результатов теста после факта.

Порядок действий следующий:

-2 PS Сценарии, каждый сFW запускаются раньше, оставаясь работающими.

-Один FW с фильтром уведомлений "A", местоположение папки просмотра "A"

-Второе FW с фильтром уведомлений "B", местоположение папки просмотра "B""

- запускается одна сборка, создается файл в соответствующем месте и фильтр

- запускается FW, вызывает сценарий Main PS для запуска тестов

What Iхотите это сделать:

-Только один FW запущен ранее, оставлен работающим

-FW с фильтрами уведомлений "A" и "B", расположение папки Watches "C "

-Одно из Builds запускается, запускает местоположение" C "

-FW как-то фильтрует или передает какую-то информацию (такую ​​как имя файла, которое я могу проанализировать в тестовом PS дляключевая фраза или что-то) в TestPS, чтобы указать, какая сборка была запущена.

-FW вызывает основной сценарий PS для запуска тестов (может произойти на том же шаге, что и выше, не обязательно имеет значение)

Я пробовал следующее:

Метод A: 2 PS, каждый со своим FW, следящим за своим местоположением, с вариацией фильтра, каждый с Register-ObjectEvent, который вызывает TestPS.(Текущий / технически работает)

Метод B: 1 PS с 2 FW каждый с изменением фильтра с 1 Register-ObjectEvent, который вызывает TestPS

Метод C: 1 PS с 2 FW каждый с фильтромвариант с 2 Register-ObjectEvents, который вызывает TestPS

Метод D: 1 PS с 1 FW, наблюдающим подкаталоги с 1 Register-ObjectEvent, который вызывает TestPS

Метод E: (Теория) 1 PS с1 FW с 2 фильтрами, который передает какой фильтр был обнаружен в TestPS

Function FileWatcher{
    $folder = New-Object IO.FileSystemWatcher " <FilePathA> ", "*.triggerOne" -Property @{
        IncludeSubdirectories = $false
        NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
    }
    $folderTwo = New-Object IO.FileSystemWatcher " <Either FilePathA or FilePathB> ", "*.triggerTwo" -Property @{
        IncludeSubdirectories = $false
        NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
    }
    $eventAction = Register-ObjectEvent ($folder) Created -SourceIdentifier FileCreated -Action {   
        try{
            Start-Process -FilePath Powershell -ArgumentList " <FilePath to TestPS> " #Within this powershell I want to somehow be able to determine which Filewatcher was triggered
        }
        catch [System.Exception]{
            Add-Content -Path " <FilePath to Txt file for logging errors> " -Value ("Error: "+$error[0])
            Write-Warning ("Error: "+$error[0])
        }
    }
    $eventActionTwo = Register-ObjectEvent ($folderTwo) Created -SourceIdentifier FileCreated -Action {   
        try{
            Start-Process -FilePath Powershell -ArgumentList " <FilePath to TestPS> " #Within this powershell I want to somehow be able to determine which Filewatcher was triggered
        }
        catch [System.Exception]{
            Add-Content -Path " <FilePath to Txt file for logging errors> " -Value ("Error: "+$error[0])
            Write-Warning ("Error: "+$error[0])
        }
    }
}

FileWatcher #Method Call

Результаты:

Метод A: Текущий / Технически работает, но требует настройкикак описано в Сводке.

Метод B: Работает, но нет указания на то, что вызывается / Нет способа создать один объект Register-ObjectEvent с двумя фильтрами

Метод C: Очевидно, что не может иметь два регистра-ObjectEvent с источником FileCreated даже с разными фильтрами.Ошибка: Register-ObjectEvent: невозможно подписаться на указанное событие.Подписчик с идентификатором источника FileCreated уже существует.<...> + CategoryInfo: InvalidArgument: (System.IO.FileSystemWatcher: FileSystemWatcher) [Register-ObjectEvent], ArgumentException + FullyQualifiedErrorId: SUBSCRIBER_EXISTS, Microsoft.PowerShell.Commands.RegisterObjectEventCommand

1065TestPS, сборка которых была запущена

Метод E: Теория, еще не пробовали

...