2015-02-08 2 views
1

Я работаю над формой, которая будет искать все подключенные диски для файлов PST.Заполнение datagridview

я могу заставить его работать с помощью следующей команды: -

Get-PSDrive -PSProvider "filesystem"|%{get-childitem $_.root -include *.pst -r}|select name, directoryname, @{name="Size (GB)";expression ={"{0:N2}" -f ($_.length/1GB)}} 

Единственная проблема, это занимает около 45 минут, чтобы пройти через все приводы и закончить поиск. Я думал о том, чтобы ускорить его, используя индекс поиска Windows.

Я получил это ....

function Searchindex{ 
$query="SELECT System.ItemName, system.ItemPathDisplay, System.ItemTypeText, System.Size FROM SystemIndex where system.itemtypetext = 'outlook data file'" 
$objConnection = New-Object -ComObject adodb.connection 
$objrecordset = New-Object -ComObject adodb.recordset 
$objconnection.open("Provider=Search.CollatorDSO;Extended Properties='Application=Windows';") 
$objrecordset.open($query, $objConnection) 

[email protected]() 

Try { $objrecordset.MoveFirst() } 
Catch [system.exception] { "no records returned" } 
do 
{ 
Write-host ($objrecordset.Fields.Item("System.ItemName")).value ` 
($objrecordset.Fields.Item("System.ItemPathDisplay")).value ` 
($objrecordset.Fields.Item("System.ITemTypeText")).value ` 
($objrecordset.Fields.Item("System.Size")).value 
if(-not($objrecordset.EOF)) {$objrecordset.MoveNext()} 
} Until ($objrecordset.EOF) 


$objrecordset.Close() 
$objConnection.Close() 
$objrecordset = $null 
$objConnection = $null 
[gc]::collect() 
} 

это выводит детали на экране в течение нескольких секунд, что является совершенным, но я не могу работать, как отобразить в представлении DataGrid.

Я использую первичную форму для создания форм.

После того как данные заполняется в DataGridView, я хочу, чтобы иметь возможность выбирать записи и копировать их на новое место

Может кто-нибудь помочь?

ТИА

Энди

ответ

0

Я не знаком с DataGridView, но я чувствую, если у вас объект, который вы бы лучше способны манипулировать.

function Searchindex{ 
$query="SELECT System.ItemName, system.ItemPathDisplay, System.ItemTypeText, System.Size FROM SystemIndex where system.itemtypetext = 'outlook data file'" 
$objConnection = New-Object -ComObject adodb.connection 
$objrecordset = New-Object -ComObject adodb.recordset 
$objconnection.open("Provider=Search.CollatorDSO;Extended Properties='Application=Windows';") 
$objrecordset.open($query, $objConnection) 

[email protected]() 

Try { $objrecordset.MoveFirst() } 
Catch [system.exception] { "no records returned" } 
do 
{ 
    $array += [pscustomobject]@{ 
     Name = ($objrecordset.Fields.Item("System.ItemName")).value 
     Path = ($objrecordset.Fields.Item("System.ItemPathDisplay")).value 
     TypeText = ($objrecordset.Fields.Item("System.ITemTypeText")).value 
     Size = ($objrecordset.Fields.Item("System.Size")).value 
    } 

    If(-not($objrecordset.EOF)) {$objrecordset.MoveNext()} 
} Until ($objrecordset.EOF) 


$objrecordset.Close() 
$objConnection.Close() 
$objrecordset = $null 
$objConnection = $null 
[gc]::collect() 

$array 
} 

Это разослать массив пользовательских объектов PowerShell. У вас уже была инициализирована переменная $array. Нам просто нужно было заполнить его.

Тогда вы можете использовать что-то подобное, чтобы отфильтровывать файлы, которые вы ищете.

Searchindex | Out-GridView -PassThru 

После удара Ok будет выбран только выходные записи.

DataGridView

с множественным и вернуть

$global:results = @() 

#...searchindex function is here .... 

$form = New-Object System.Windows.Forms.Form 
$form.Size = New-Object System.Drawing.Size(900,600) 
$dataGridView = New-Object System.Windows.Forms.DataGridView 
$dataGridView.Size=New-Object System.Drawing.Size(800,400) 
$dataGridView.SelectionMode = 'FullRowSelect' 
$dataGridView.MultiSelect = $true 
$go = New-Object System.Windows.Forms.Button 
$go.Location = New-Object System.Drawing.Size(300,450) 
$go.Size = New-Object System.Drawing.Size(75,23) 
$go.text = "Select" 
$form.Controls.Add($go) 
$form.Controls.Add($dataGridView) 


$arraylist = New-Object System.Collections.ArrayList 
$arraylist.AddRange((Searchindex)) 
$dataGridView.DataSource = $arraylist 


$dataGridView.Columns[0].width = 240 

$go.Add_Click(
{ 
    $dataGridView.SelectedRows| ForEach-Object{ 
     $global:results += [pscustomobject]@{ 
      Name = $dataGridView.Rows[$_.Index].Cells[0].Value 
      Path = $dataGridView.Rows[$_.Index].Cells[1].Value 
      TypeText = $dataGridView.Rows[$_.Index].Cells[2].Value 
      Size = $dataGridView.Rows[$_.Index].Cells[3].Value 
     } 
     $form.Close() 
    } 

}) 

$form.ShowDialog() 
$global:results 

Там есть много, чтобы покрыть здесь, но посмотрите на примерах и дайте мне знать, как это работает для вас. Он вернет все выбранные строки назад как объекты в глобальной переменной $global:results. Он должен быть глобальным, поскольку вывод не сохраняется за пределами $go.Add_Click. Функция searchindex существует, но не указана во втором примере кода, чтобы сэкономить место.

+0

Это работает очень хорошо. Спасибо. Как я могу получить вывод, который будет отображаться в столбцах? –

+0

Вы говорите о 'DataGridView' или' Out-GridView'? Причина 'Out-GridView' отображает столбцы по умолчанию? – Matt

+0

Datagridview идеально –