本文共 3181 字,大约阅读时间需要 10 分钟。
最近PowerShell的QQ群里面流行用GUI界面装B,为了紧跟潮流,豆子也做了个小程序,这个小程序的可以根据操作系统和关键字,扫描域内的计算机是否安装了对应的软件。
界面如下
这个界面是通过PowerShell Studio 2015做的,主要使用了label,combox, textbox, datagridview,savafilediag, button几个控件。
几个关键点
1. 根据操作系统和关键字查询
function Get-Software{[cmdletbinding()]param ([parameter(mandatory = $true, position = 1)][string]$software,[string]$computername = "*",[string]$OS)Write-Verbose "Scanning Computers..."if ($computername -ne '*'){$a = Get-ADComputer -Filter "operatingsystem -like '*$OS*' -and name -like '*$computername*' " -Properties operatingsystem, ipv4address | Where-Object{ $_.ipv4address -ne $null } | select -ExpandProperty name}else{$a = Get-ADComputer -Filter "operatingsystem -like '*$OS*' " -Properties operatingsystem, ipv4address | Where-Object{ $_.ipv4address -ne $null } | select -ExpandProperty name}$progressbaroverlay1.Maximum=100$progressbaroverlay1.Value=20#$MainForm.Refresh()Write-Verbose "Scanning Software ..."$s = Invoke-Command -ComputerName $a -erroraction SilentlyContinue -ErrorVariable disconnect{param ([string]$name)if ([System.IntPtr]::Size -eq 4){Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object{ $_.displayname -like "*$name*" } | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate}else{Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*, HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object{ $_.displayname -like "*$name*" } | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate}} -ArgumentList $software$progressbaroverlay1.Value=80#$MainForm.Refresh()#Write-Verbose "Disconnected Computers"#$disconnect.targetobject$progressbaroverlay1.Value | Out-String|Write-Host$s }
2. 把上面生成的对象绑定到datagridview 里面 注意 ConvertTo-DataTable 是通过自带的Snippet生成的(拖曳Snippet到自己的脚本块即可)
$table = ConvertTo-DataTable -InputObject $resultLoad-DataGridView -DataGridView $datagridview1 -Item $table$progressbaroverlay1.Visible = $false
3. DataGridView排序
$datagridview1_ColumnHeaderMouseClick = [System.Windows.Forms.DataGridViewCellMouseEventHandler]{#Event Argument: $_ = [System.Windows.Forms.DataGridViewCellMouseEventArgs]if ($datagridview1.DataSource -is [System.Data.DataTable]){$column = $datagridview1.Columns[$_.ColumnIndex]$direction = [System.ComponentModel.ListSortDirection]::Ascendingif ($column.HeaderCell.SortGlyphDirection -eq 'Descending'){$direction = [System.ComponentModel.ListSortDirection]::Descending}$datagridview1.Sort($datagridview1.Columns[$_.ColumnIndex], $direction)}}
4. 保存
Function Set-FileName($initialDirectory){[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") |Out-Null$savefiledialog1.InitialDirectory = $initialDirectory$savefiledialog1.Filter="All files (*.*) | *.*"$savefiledialog1.ShowDialog() | Out-Null$savefiledialog1.FileName#model:Set-FileName -initialDirectory "D:\Scripts\例子"}$button保存_Click = {#TODO: Place custom script here$file = set-FileNameWrite-Verbose "Print Out"$datagridview1.Rows |select -expand DataBoundItem |export-csv $file -NoType}
5.进度条
我是手动在对应的地方配置的进度比例。当然也可以根据循环自动的增加进度step。
比如快结束的时候,我设定进度为90%
$progressbaroverlay1.Value = 90
附件里整个project的源代码,感兴趣的可以下载看看。
转载地址:http://jousa.baihongyu.com/