2013-07-31 21 views

回答

0

你應該在你的腳本最begining使用trap指令。 trap指令將捕獲PowerShell代碼中的任何異常。在陷阱腳本塊中,您只需在文件或Windows日誌中記錄異常。

+0

感謝分享信息。在調查此問題時,我們已經確定何時有人使用Admin權限連接遠程計算機並直接註銷,而不是關閉遠程窗口,Powershell將自動關閉。我們需要知道誰當前以管理員權限登錄並記錄了遠程會話。這些信息應該記錄在某個地方。你能幫忙找到解決方案嗎? – user2638021

0

可以通過添加這劇本的開頭記錄PowerShell會話的完整記錄:

Start-Transcript <path to transcript file> -Append 

爲方便起見,給記錄文件擴展名爲.txt。

-Append交換機將保留每個會話覆蓋早期會話的記錄。您將能夠知道來自哪個會話的輸出,因爲該腳本會添加一個頁眉和頁腳,告訴您腳本何時開始和結束,以及主機名,操作系統版本以及它運行的帳戶。


正如我在評論中所提到的,這顯然是不可能的PowerShell會話本身的報告時意外終止,但你可以有另一個腳本啓動它作爲後臺作業,並保持輪詢它,直到它結束,然後報告時間和退出狀態。該功能將這樣的伎倆:

function Measure-EndTime { 
    param(
    [string]$Command, 
    [int]$PollingInterval # seconds 
) 

    $job = Start-Job -ScriptBlock {$Command} 
    do { 
    sleep $PollingInterval 
    } until ($job.State -ne 'Running') 
    echo "Job ended $(Get-Date -format 'yyyy-MM-dd HH:mm:ss.ff'): $($job.State)" 
} 

你會調用它是這樣的:

Measure-EndTime -Command "& <path>\scheduler.ps1" -PollingInterval 10 

這會給你結束時間約10秒的精度,與像Job ended 2013-08-05_17-57-18.24: Completed的消息。您可以根據您想要承受的系統負載來增加或減少您想要衡量的準確度的輪詢間隔。輪詢間隔不一定是一個整數。如果需要,您可以將其設置爲.25以每四分之一秒輪詢一次。

+0

感謝您提供寶貴的信息。請在文本文件中找到我們已收到的輸出。 我們可以看到開始時間。但是,我們無法看到結束時間。 我們需要在您提供的用於顯示結束時間的命令行中添加其他任何內容。 – user2638021

+0

以下是輸出:********************** Windows PowerShell腳本開始 開始時間:20130731110940 用戶名:Test \ Test_services 機器:測試(Microsoft Windows NT 5.2.3790 Service Pack 2) ********************** 已啓動腳本,輸出文件爲Test.txt 組件調度器POWERSHELL腳本1.1版 刪除所有文件包括(.IN,.txt和.cps)的.pgp擴展名 下一次執行:2013-07-31 11:10:18 ***************** ****** – user2638021

+0

結束時間會自動顯示,但前提是PowerShell乾淨地存在或使用** Stop-Transcript **手動停止抄本。如果powershell進程仍在運行,或者調度程序殺死它,則不會有結束時間。 –

0

您可以嘗試的一件事是訂閱PowerShell.Exiting引擎事件。如果PowerShell沒有通過X按鈕關閉,它不會工作,如果PowerShell意外崩潰,我不確定它是否有效。

Register-EngineEvent PowerShell.Exiting -SupportEvent –Action { ... } 
+0

謝謝謝。我們已經嘗試了下面的命令。 Register-EngineEvent PowerShell.Exiting -Action {「PowerShell exited at」+(Get-Date)| Out-File d:\ ag \ log.txt -Append} 我們可以成功查看PowerShell會話的最後退出時間。但是,只要會話異常終止或者我們正在手動關閉會話,它就不會工作。 你能就此建議嗎? – user2638021