none
PowerShell 使用 EXCEL問題 RRS feed

  • 問題

  • 各位前輩

    我有一個需求是想要列出目前一台伺服器中某些特定 process 的 使用者、CPU使用時間、記憶體使用量、I/O讀寫量

    並將資料存成一個EXCEL檔案後將檔案透過墊子郵件發送。

    我自己參考一些網路上的資列寫出了一個如下的程式碼。( 電子郵件發送部分不再本支程式)

    $processes = Get-WmiObject -class Win32_Process -filter "name='notepad.exe'"
    $processes01 = get-process notepad
    $processes02 = $processes 
    $excel = New-Object -ComObject Excel.Application
    #$excel.Visible = $true
    $strpath = 'D:\test\test.csv'
    $workbook = $excel.Workbooks.add()
    $sheet = $workbook.worksheets.Item(1)
    $workbook.workSheets.item(3).delete()
    $workbook.WorkSheets.item(2).delete()
    $workbook.WorkSheets.item(1).Name = "test"
    $sheet = $workbook.WorkSheets.Item("test")
    $x = 2
    $y = 2
    $lineStyle = "microsoft.office.interop.excel.xlLineStyle" -as [type]
    $colorIndex = "microsoft.office.interop.excel.xlColorIndex" -as [type]
    $borderWeight = "microsoft.office.interop.excel.xlBorderWeight" -as [type]
    $chartType = "microsoft.office.interop.excel.xlChartType" -as [type]
    For($b = 1 ; $b -le 6 ; $b++)
    {
     $sheet.cells.item(1,$b).font.bold = $true
     $sheet.cells.item(1,$b).borders.LineStyle = $lineStyle::xlDashDot
     $sheet.cells.item(1,$b).borders.ColorIndex = $colorIndex::xlColorIndexAutomatic
     $sheet.cells.item(1,$b).borders.weight = $borderWeight::xlMedium
    }
    $sheet.cells.item(1,1) = "Name of Process"
    $sheet.cells.item(1,2) = "Users"
    $sheet.cells.item(1,3) = "CPU Use times (S) "
    $sheet.cells.item(1,4) = "Memory Use (Byte)"
    $sheet.cells.item(1,5) = "Disk Read ( Byte)"
    $sheet.cells.item(1,6) = "Disk Write (Byte)"
    
    Foreach($process in $processes)
    {
     $sheet.cells.item($x, 1) = $process.name
     $sheet.cells.item($x,2) = $process.GetOwner().User
     $sheet.cells.item($x,4) = $process.workingSetSize
     $sheet.cells.item($x,5) = $process.ReadTransferCount
     $sheet.cells.item($x,6) = $process.WriteTransferCount
     $x++
    } #end foreach
    Foreach($process01 in $processes01)
    {
     $sheet.cells.item($y,3) = $process01.cpu
     $y++
    } #end foreach
    $range = $sheet.usedRange
    $range.EntireColumn.AutoFit() | out-null
    
    IF(Test-Path $strPath)
      { 
       Remove-Item $strPath
       $Excel.ActiveWorkbook.Saveas($strPath)
      }
    ELSE
      {
       $Excel.ActiveWorkbook.Saveas($strPath)
      }
    
     
    
    
     
    

    程式如果是直接執行不會有問題。

    但我如果想要將這隻程式更改為背景執行 ( 例如用排定工作定期執行...等)

    就會出現下列的錯誤,

    以 "1" 引數呼叫 "SaveAs" 時發生例外狀況: "Class Workbook 的 SaveAs 方法失敗"
    位於 D:\test\test_process.ps1:53 字元:32
    +    $Excel.ActiveWorkbook.Saveas <<<< ($strPath)
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : ComMethodTargetInvocation

    想請教的除了程式為何放到背景執行會出現這問題外,

    程式本身有沒有辦法可以在更精簡優化外。

    先謝謝各位前輩們指教。

    2013年3月27日 下午 02:35

所有回覆