2017-02-10 61 views
2

希望有人能幫我弄清楚這是否可能。我有一個20個ish行,在一個while循環中掃描一個日誌文件。我需要這個與腳本的其餘部分並行發生。日誌掃描循環將條目傳遞給SQLite,其他腳本需要對這些信息採取行動 - 因此希望並行運行它們。PowerShell:開始 - 作業 - 腳本塊多行腳本塊?

如果我使用Job-Start命令,那麼看起來-SciptBlock函數將只接受一個管道命令行。我有太多的命令想要管道,所以我需要在scriptblock中運行多行。

我嘗試了幾種方法,但下面的例子給出了最少的錯誤。我也在Invoke-Command -ScriptBlock中嘗試過 - 像在第二個例子中一樣 - 兩種方式都不會接受多行腳本塊。

我在做什麼錯了?

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'循環(或者從未關閉scriptblock,這取決於你如何看待它),但是應該給你這個錯誤:'在語句塊中缺少關閉'}'或類型定義「。你也可以在'while'語句中引用'RunLoop',而不是'$ RunLoop',它也會拋出自己的錯誤。請提供[mcve]或至少張貼您的實際代碼。 – briantist

+0

對不起我的壞 - 應該指出這僅僅是一個例子,我輸入它在stackoverflow編輯器,而不是Powershell ISE,所以沒有注意到我的{}沒有排隊。 – SynxUK

回答

0

使用時啓動工作,並調用命令小心將左{關於同一行的命令-ScriptBlock參數。不要像在'if'或'while'命令中那樣將它放在下面的行中。

這導致了一個進一步的問題,就是你沒有正確地匹配開放{和關閉}括號,因爲你習慣於匹配它們的縮進級別來配對它們。

該問題已被編輯以演示使用while循環掃描文件夾中最新JSON格式日誌文件的最新行並將其傳遞到數組的一個工作'後臺'作業的代碼。

請注意,在代碼中引用$ Event.timestamp。這些來自於其中一個JSON字段被稱爲timestamp的事實 - 它不是標準字符串或數組的方法或屬性。