none
PowerShell - ListBox - несколько столбцов в списке RRS feed

  • Вопрос

  • Добрый день! У меня вопрос по PowerShell - не могу никак разобраться с GUI. Задача такая - нужно вывести результат определенной команды в форму, в виде списка. Обычно прибегал к такому решению (на примере списка заблокированных доменов):

    $listBypassedSender=(Get-SenderFilterConfig).BlockedDomains

    foreach ($item in $listBypassedSender)
    {
       $objListBox.Items.Add($item)
    }

    Здесь все понятно, список просто последовательно добавляется в элемент ListBox. Но теперь нужно добавлять не один, а несколько столбцов - ListBox не принимает несколько значений подряд, то есть:

    ...

    $objListBox.Items.Add($item.Sender, $item.TimeStamp)

    ...

    в таком виде не работает. Может ли элемент управления ListBox в принципе добавлять строки с несколькими столбцами? Спасибо.

    15 июля 2015 г. 8:05

Ответы

  • Add-Type -AssemblyName System.Windows.Forms
    $Form = New-Object System.Windows.Forms.Form
    $Form.Width = 500
    $Form.Height = 500 
    
    $listView = New-Object System.Windows.Forms.ListView
    $listView.View = 'Details'
    $listView.Width = 500
    $listView.Height = 500
    
    $listView.Columns.Add('Sender') | Foreach {$_.Width = 100}
    $listView.Columns.Add('Recipients') | Foreach {$_.Width = 100}
    $listView.Columns.Add('TimeStamp') | Foreach {$_.Width = 100}
    
    $listMessageLog=Get-messagetrackingLog -Start "7/14/2015 00:00 AM" -End "7/14/2015 04:00 AM" -Recipients "user@domain.ru"
    
    foreach ($i in $listMessageLog) {
    	$item = New-Object System.Windows.Forms.ListViewItem($i.Sender)
    	$item.SubItems.Add([string]$i.Recipients)
    	$item.SubItems.Add([string]$i.TimeStamp)
    	$listView.Items.Add($item) | Out-Null
    }
    
    $Form.Controls.Add($listView)
    [void] $Form.ShowDialog()
    
    

    Или при использовании Out-GridView:

    Get-messagetrackingLog -Start "7/14/2015 00:00 AM" -End "7/14/2015 04:00 AM" -Recipients "user@domain.ru" | Select Sender,Recipients,TimeStamp | Out-GridView

    16 июля 2015 г. 9:48

Все ответы

  • 1) Использовать ListView

    Add-Type -AssemblyName System.Windows.Forms
    $Form = New-Object System.Windows.Forms.Form
    $Form.Width = 500
    $Form.Height = 500 
    
    $item1 = New-Object System.Windows.Forms.ListViewItem('1')
    $item1.SubItems.Add('Саша')
    $item1.SubItems.Add('Иванов')
    
    $item2 = New-Object System.Windows.Forms.ListViewItem('2')
    $item2.SubItems.Add('Петя')
    $item2.SubItems.Add('Сидоров')
    
    $item3 = New-Object System.Windows.Forms.ListViewItem('3')
    $item3.SubItems.Add('Маша')
    $item3.SubItems.Add('Селиванова')
    
    
    $listView = New-Object System.Windows.Forms.ListView
    $listView.View = 'Details'
    $listView.Width = 500
    $listView.Height = 500
    
    $listView.Columns.Add('Номер') | Foreach {$_.Width = 100}
    $listView.Columns.Add('Имя') | Foreach {$_.Width = 100}
    $listView.Columns.Add('Фамилия') | Foreach {$_.Width = 100}
    
    
    $listView.Items.AddRange(($item1, $item2, $item3))
    
    $Form.Controls.Add($listView)
    [void] $Form.ShowDialog()

    2) А чем не устраивает Out-GridView

    Get-Process  | Out-GridView

    15 июля 2015 г. 8:33
  • Да честно говоря, раздражает отсутствие старого доброго Tracking log explorer (так и не понял, зачем его убрали в 2013 версии). Вот хочу нечто подобное написать, чтобы даже рядовые сотрудники могли с рабочих станций домена посмотреть логи - каждый своего ящика.

    15 июля 2015 г. 8:51
  • Решается одной командой.

    Get-MessageTrackingLog   | Out-GridView

    15 июля 2015 г. 8:55
  • И все-таки возвращаясь к скрипту - никак не пойму, как правильно развернуть информацию из команды get-messagetrackinglog:

    $listMessageLog=Get-messagetrackingLog -Start "7/14/2015 00:00 AM" -End "7/14/2015 04:00 AM" -Recipients "user@domain.ru" | Select Sender,{$_.Recipients},TimeStamp

    foreach ($item in $listMessageLog)
    {
      $itemx = New-Object System.Windows.Forms.ListViewItem($item.Sender)
      $itemx.SubItems.Add($item.{$_.Recipients})
      $itemx.SubItems.Add($item.TimeStamp)
      $listView.Items.AddRange($itemx)
    }

    В таком виде выводятся в результирующий ListView только Sender и Recipients, а на третье поле ругается:

    "Cannot convert argument "item", with value: "14.07.2015 3:27:29", for "Add" to type "System.Windows.Forms.ListViewItem+ListViewSubItem" "

    Как быть с полем дата/время?

    поправка - вроде бы получилось вот так:

    foreach ($item in $listMessageLog)
    {
      $itemx = New-Object System.Windows.Forms.ListViewItem($item.Sender)
      $itemx.SubItems.Add($item.{$_.Recipients})
      $symb=[string]$item.{$_.TimeStamp}
      $itemx.SubItems.Add($symb)
      $listView.Items.AddRange($itemx)
    }


    16 июля 2015 г. 8:31
  • Add-Type -AssemblyName System.Windows.Forms
    $Form = New-Object System.Windows.Forms.Form
    $Form.Width = 500
    $Form.Height = 500 
    
    $listView = New-Object System.Windows.Forms.ListView
    $listView.View = 'Details'
    $listView.Width = 500
    $listView.Height = 500
    
    $listView.Columns.Add('Sender') | Foreach {$_.Width = 100}
    $listView.Columns.Add('Recipients') | Foreach {$_.Width = 100}
    $listView.Columns.Add('TimeStamp') | Foreach {$_.Width = 100}
    
    $listMessageLog=Get-messagetrackingLog -Start "7/14/2015 00:00 AM" -End "7/14/2015 04:00 AM" -Recipients "user@domain.ru"
    
    foreach ($i in $listMessageLog) {
    	$item = New-Object System.Windows.Forms.ListViewItem($i.Sender)
    	$item.SubItems.Add([string]$i.Recipients)
    	$item.SubItems.Add([string]$i.TimeStamp)
    	$listView.Items.Add($item) | Out-Null
    }
    
    $Form.Controls.Add($listView)
    [void] $Form.ShowDialog()
    
    

    Или при использовании Out-GridView:

    Get-messagetrackingLog -Start "7/14/2015 00:00 AM" -End "7/14/2015 04:00 AM" -Recipients "user@domain.ru" | Select Sender,Recipients,TimeStamp | Out-GridView

    16 июля 2015 г. 9:48