2013-11-25 32 views
1

所以我想寫一個powershell腳本,將通過一個文件夾完整的.evtx文件,通過系統日誌發送出每一個,然後追加「.done」在這樣做之後將其添加到.evtx文件的文件名中。在一個foreach對象循環中Logparser和powershell與多個日誌文件

事情是,我不太清楚如何引用我在Foreach-Object循環內的當前日誌文件。

希望下面的代碼能解釋我的dillema。

# begin foreach loop 
Get-ChildItem $evtxfolder -Filter *.evtx | ` 
Foreach-Object { 
$LPARGS = ("-i:evt", "-o:syslog", "SELECT STRCAT(`' evt-Time: `', TO_STRING(TimeGenerated, `'dd/MM/yyyy, hh:mm:ss`')),EventID,SourceName,ComputerName,Message INTO $SERVER FROM $CURRENTOBJECT") #obviously, this won't work. 
$LOGPARSER = "C:\Program Files (x86)\Logparser 2.2\logparser.exe" 
$LP = Start-Process -FilePath $LOGPARSER -ArgumentList $LPARGS -Wait -Passthru -NoNewWindow 
$LP.WaitForExit() # wait for logs to finish 

如果你看$ LPARGS,你會看到我把$ SERVER和$ CURRENTOBJECT。顯然,我現在擁有它的方式不會奏效,但很明顯,這是行不通的。所以基本上,我試圖將變量$ SERVER(作爲參數傳入)放入logparser的參數中,並引用它正在處理的所有當前事件日誌以放入「FROM」語句中,以便它知道工作在一個.evtx文件上。什麼是正確的方法來做到這一點?

FROM語句的INTO的例子:

..snippet.. 
SourceName,ComputerName,Message INTO @192.168.56.30 FROM 'C:\Eventlogs\20131125.evtx'" 

當然, 'C:\事件日誌時\ 20131125.evtx',因爲它經過了目錄的內容會發生變化。

+0

我們的powershell版本是2. – Ondaje

+0

哪個是最後的ps1? – Kiquenet

回答

2

如果$server在上面的腳本之外定義,它將在$ LPARGS的字符串內部可用。至於$ CURRENTOBJECT,那將是$_。在這種情況下,它將是一個FileInfo對象。很可能你想要Name屬性,例如$($_.Name)

+0

好吧,那麼我應該將$ SERVER更改爲$($ _。SERVER)?在$ LPARGS內?這仍然留下如何處理$ CURRENTOBJECT的問題 – Ondaje

+1

'$ _'表示您使用'Get-ChildItem $ evtxfolder -Filter * .evtx'檢索的每個文件並將其發送到管道。您需要爲'$ SERVER'所做的所有操作都在迭代evtx文件的腳本之前設置,例如'$ SERVER ='servername''。 –

+0

那麼$ CURRENTOBJECT應該是$($ _。)呢?我不是100%確定的,我明白。 – Ondaje