2017-02-10 8 views
2

Надеясь, что кто-то может помочь мне разобраться, возможно ли это. У меня есть 20 строк, которые сканируют файл журнала в цикле while. Мне нужно, чтобы это произошло параллельно с остальной частью скрипта. Цикл сканирования журнала передает записи в SQLite, и другие скрипты должны действовать по этой информации, поэтому они хотят запускать их параллельно.PowerShell: Start-Job -scriptblock Многострочные скриптовые блоки?

Если я использую команду Job-Start, то, похоже, функция -SciptBlock будет принимать только одну линию команд. У меня слишком много команд, которые хотят подключиться, поэтому мне нужно запустить несколько строк в скриптблоке.

Я пробовал несколько способов сделать это, но следующие примеры дают наименьшие ошибки. Я также попробовал это в задании Invoke-Command-ScriptBlock-as, как во втором примере, - оба способа не будут принимать многострочный скриптовый блок.

что я делаю неправильно, пожалуйста?

Start-Job -Name LogScan -ScriptBlock { 
    $EventOld = ConvertFrom-Json (Get-content (Get-ChildItem | Sort-Object -Property LastWriteTime | Select-Object -last 1) | Select-Object -last 1) 
    $RunLoop = 1 
    while (RunLoop -ge 1) 
    { 
    Start-Sleep -Milliseconds 333 
    $RunLoop = $RunLoop +1 
    $EventNew = ConvertFrom-Json (Get-content (Get-ChildItem | Sort-Object -Property LastWriteTime | Select-Object -last 1) | Select-Object -last 1) 
    if ($EventOld.timestamp -ne $EventNew.timestamp) 
     { 
     # lots of commands and here passing the array to SQLite 
     } 
    $EventOld = $EventNew 
    } 
} 

Ошибка заключается в следующем:

** Ошибка удалена, как проблема решена. Выше приведен пример многострочного задания скриптового блока. подумал, что лучше всего держать его здесь, поскольку я нашел очень мало примеров онлайн, исследуя его.

Престижность Briantist помог мне попасть :)

+0

Это ваш фактический код? Ошибка говорит, что имя задания - «JournalScan», но код говорит «LogScan». Я спрашиваю, потому что нет ничего плохого в многострочном скриптовом блоке, и насколько я могу сказать, что ваш синтаксис верен, так что мне интересно, сможет ли «другой» вызов показать, что происходит. – briantist

+1

О, я только что заметил что-то, вы никогда не закрывали цикл while (или никогда не закрывали скриптблока, в зависимости от того, как вы его смотрите), но это должно было дать вам эту ошибку: «Отсутствие закрытия»} в блоке оператора или type. «Вы также ссылаетесь на« RunLoop »в своей инструкции' while' вместо '$ RunLoop', которая также должна была вызвать свою собственную ошибку. Пожалуйста, предоставьте [mcve] или, по крайней мере, разместите свой фактический код. – briantist

+0

Извините, мой плохой - должен был указать, что это всего лишь пример, и я набрал его в редакторе stackoverflow, а не Powershell ISE, поэтому не заметил, что мой {} не выстраивался в линию. – SynxUK

ответ

0

При использовании Start-Job и Invoke-Command быть осторожным, чтобы поставить открытие {параметра -scriptblock на той же строке, что и команда. Не помещайте его в строку ниже, как вы бы с командой «if» или «while».

Это приводит к дальнейшему устранению неподтверждения, что вы не соответствовали открытию {и закрытию} скобок должным образом, поскольку вы привыкли к соглашению о соответствии их уровню отступа, чтобы соединить их.

Вопрос был отредактирован, чтобы продемонстрировать код рабочего задания фона, который использует цикл while для сканирования последней строки последнего файла журнала в формате JSON в папке и передачи его в массив.

Обратите внимание, что в ссылках на $ Event.timestamp в коде. Они исходят из того, что одно из полей JSON называется timestamp - это не метод или свойство стандартной строки или массива.

Смежные вопросы