Question [Fonction]Out-form, un GUI dynamique

Plus d'informations
il y a 15 ans 4 mois #3358 par Laurent Dardenne
J'ai trouvé ce script lors de recherche sur le net, il est très intéressant dans sa manière d'associer des objets graphique, des cmdlets et des script blocs.

Je vous laisse l'analyser il assez simple et très astucieux je trouve.
[code:1]
function out-form {
#from blogs.vmware.com/vipowershell/2007/10/powershell-guis.html

# out-form -title \"Services\" -data (get-service) `
# -columnNames (\"Name\", \"Status\") `
# -columnProperties (\"DisplayName\", \"Status\") `
# -actions @{\"Start\" = {$_.start()}; \"Stop\" = {$_.stop()};}

param ($title = \"\", $data = $null, $columnNames = $null,
$columnProperties = $null, $actions = $null)

# a little data defaulting/validation
if ($columnNames -eq $null) {
$columnNames = $columnProperties
}
if ($columnProperties -eq $null -or
$columnNames.Count -lt 1 -or
$columnNames.Count -ne $columnProperties.Count) {
throw \"Data validation failed\"
}
$numCols = $columnNames.Count

# figure out form width
$width = $numCols * 200
$actionWidth = $actions.Count * 100 + 40
if ($actionWidth -gt $width) {
$width = $actionWidth
}

# set up form
$form = new-object System.Windows.Forms.Form
$form.text = $title
$form.size = new-object System.Drawing.Size($width, 400)
$panel = new-object System.Windows.Forms.Panel
$panel.Dock = \"Fill\"
$form.Controls.Add($panel)

$lv = new-object windows.forms.ListView
$panel.Controls.Add($lv)

# add the buttons
$btnPanel = new-object System.Windows.Forms.Panel
$btnPanel.Height = 40
$btnPanel.Dock = \"Bottom\"
$panel.Controls.Add($btnPanel)

$btns = new-object System.Collections.ArrayList
if ($actions -ne $null) {
$btnOffset = 20
foreach ($action in $actions.GetEnumerator()) {
$btn = new-object windows.forms.Button
$btn.DialogResult = [System.Windows.Forms.DialogResult]\"OK\"
$btn.Text = $action.name
$btn.Left = $btnOffset
$btn.Width = 80
$btn.Top = 10
$exprString = '{$lv.SelectedItems | foreach-object { $_.Tag } | foreach-object {' + $action.value + '}}'
$scriptBlock = invoke-expression $exprString
$btn.add_Click($scriptBlock)
$btnPanel.Controls.Add($btn)
$btnOffset += 100
$btns += $btn
}
}

# create the columns
$lv.View = [System.Windows.Forms.View]\"Details\"
$lv.Size = new-object System.Drawing.Size($width, 350)
$lv.FullRowSelect = $true
$lv.GridLines = $true
$lv.Dock = \"Fill\"
foreach ($col in $columnNames) {
$lv.Columns.Add($col, 200) > $null
}

# populate the view
foreach ($d in $data) {
$item =
new-object System.Windows.Forms.ListViewItem(
invoke-expression ('$d.' + $columnProperties[0]))

for ($i = 1; $i -lt $columnProperties.Count; $i++) {
[string]$Content=$d.\"$($columnProperties[$i])\"
$item.SubItems.Add($Content) > $null
}
$item.Tag = $d
$lv.Items.Add($item) > $null
}

# display it
$form.Add_Shown( { $form.Activate() } )
if ($btns.Count -gt 0) {
$form.AcceptButton = $btns[0]
}
$form.showdialog()
}code:1]
Le chargement de cette assembly peut être nécessaire
[code:1]
[System.Reflection.Assembly]::Load(\"System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\"«») > $null
[/code:1]
Si vous trouvez des traitements intéressant autour de ce script poster la ligne d'appel à la suite, comme ceci :
[code:1]
out-form -title \"Services\" -data (get-service) `
-columnNames (\"Name\", \"Status\"«») `
-columnProperties (\"DisplayName\", \"Status\"«») `
-actions @{\"Start\" = {$_.start()}; \"Stop\" = {$_.stop()};}
[/code:1]
[edit]
Modification pour PS v2 et v3<br><br>Message édité par: Laurent Dardenne, à: 1/10/13 18:12

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.064 secondes
Propulsé par Kunena