Я хочу, чтобы пользователь мог выбрать функции, которые он хочет запустить, и затем нажать кнопку, чтобы просмотреть вывод.
У меня он работает для большинства моих функций, но некоторые из них неКажется, что завершено.Я в основном создаю массив с именами всех функций, которые они выбирают, и затем использую цикл ForEach
, чтобы выполнить каждую выбранную ими функцию.
Странная вещь - некоторые из моих функций, кажется, неделайте что-нибудь, но если я наберу их в консоль PowerShell, они будут работать нормально.
Снимок экрана моей формы
Вот код для кнопки "Выполнить выбранное":
$RunSelectedButton_Click = {
Import-Module SHB_Testing_Module
[array]$SelectedFunctions = @()
If ($ActiveClientCheck.Checked -eq $true) {$SelectedFunctions += "ActiveClientCheck"}
If ($ClientSoftwareCheck.Checked -eq $true) {$SelectedFunctions += "ClientSoftwareCheck"}
If ($CrashControlKeyCheck.Checked) {$SelectedFunctions += "CrashControlKeyCheck"}
If ($DiskCheck.Checked) {$SelectedFunctions += "DiskCheck"}
If ($DriverCheck.Checked) {$SelectedFunctions += "DriverCheck"}
If ($GPOCheck.Checked) {$SelectedFunctions += "GPOCheck"}
If ($ListInstalledSoftware.Checked) {$SelectedFunctions += "ListInstalledSoftware"}
If ($ListMSHotfix.Checked) {$SelectedFunctions += "ListMSHotfix"}
If ($MSOfficePatchCheck.Checked) {$SelectedFunctions += "MSOfficePatchCheck"}
If ($PDFDefaultSoftwareCheck.Checked) {$SelectedFunctions += "PDFDefaultSoftwareCheck"}
If ($SCCMVersionCheck.Checked) {$SelectedFunctions += "SCCMVersionCheck"}
If ($WebsiteCheck.Checked) {$SelectedFunctions += "WebsiteCheck"}
If ($RunAllFunctions.Checked) {$SelectedFunctions = @('ActiveClientCheck', 'ClientSoftwareCheck', 'DiskCheck', 'DriverCheck', 'GPOCheck', 'ListInstalledSoftware', 'ListMSHotfix', 'MSOfficePatchCheck', 'PDFDefaultSoftwareCheck', 'SCCMVersionCheck', 'WebsiteCheck')}
ForEach ($FunctionName in $SelectedFunctions) {
Write-Host $FunctionName -ForegroundColor Yellow
Invoke-Expression $FunctionName
Start-Sleep 10
Write-Host ""
}
}
. (Join-Path $PSScriptRoot 'MainForm.designer.ps1')
$SHBTestingTool.ShowDialog() | Out-Null
Я попытался передать строку Invoke-Expression
на Out-Null
и, используя &
для вызова функций вместо Invoke-Expression
.
Я получаю те же результаты скаждая из них будет выполнять большинство функций, но некоторые не будут работать.
Те, которые не будут работать с консоли PS, хотя.Вот функции, которые не хотят работать:
Function DriverCheck
{
Get-WmiObject Win32_PnPSignedDriver| Select-Object devicename, driverversion | Where-Object {$_.devicename -like "*"}
}
#http://jongurgul.com/blog/installedsoftware/
Function ListInstalledSoftware{
Param([String[]]$Computers)
If (!$Computers) {$Computers = $ENV:ComputerName}
$Base = New-Object PSObject;
$Base | Add-Member Noteproperty ComputerName -Value $Null;
$Base | Add-Member Noteproperty Name -Value $Null;
$Base | Add-Member Noteproperty Publisher -Value $Null;
$Base | Add-Member Noteproperty InstallDate -Value $Null;
$Base | Add-Member Noteproperty EstimatedSize -Value $Null;
$Base | Add-Member Noteproperty Version -Value $Null;
$Base | Add-Member Noteproperty Wow6432Node -Value $Null;
$Results = New-Object System.Collections.Generic.List[System.Object];
ForEach ($ComputerName in $Computers){
$Registry = $Null;
Try{$Registry = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine,$ComputerName);}
Catch{Write-Host -ForegroundColor Red "$($_.Exception.Message)";}
If ($Registry){
$UninstallKeys = $Null;
$SubKey = $Null;
$UninstallKeys = $Registry.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Uninstall",$False);
$UninstallKeys.GetSubKeyNames()|ForEach-Object{
$SubKey = $UninstallKeys.OpenSubKey($_,$False);
$DisplayName = $SubKey.GetValue("DisplayName");
If ($DisplayName.Length -gt 0){
$Entry = $Base | Select-Object *
$Entry.ComputerName = $ComputerName;
$Entry.Name = $DisplayName.Trim();
$Entry.Publisher = $SubKey.GetValue("Publisher");
[ref]$ParsedInstallDate = Get-Date
If ([DateTime]::TryParseExact($SubKey.GetValue("InstallDate"),"yyyyMMdd",$Null,[System.Globalization.DateTimeStyles]::None,$ParsedInstallDate)){
$Entry.InstallDate = $ParsedInstallDate.Value
}
$Entry.EstimatedSize = [Math]::Round($SubKey.GetValue("EstimatedSize")/1KB,1);
$Entry.Version = $SubKey.GetValue("DisplayVersion");
[Void]$Results.Add($Entry);
}
}
If ([IntPtr]::Size -eq 8){
$UninstallKeysWow6432Node = $Null;
$SubKeyWow6432Node = $Null;
$UninstallKeysWow6432Node = $Registry.OpenSubKey("Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall",$False);
If ($UninstallKeysWow6432Node) {
$UninstallKeysWow6432Node.GetSubKeyNames()|ForEach-Object {
$SubKeyWow6432Node = $UninstallKeysWow6432Node.OpenSubKey($_,$False);
$DisplayName = $SubKeyWow6432Node.GetValue("DisplayName");
If ($DisplayName.Length -gt 0){
$Entry = $Base | Select-Object *
$Entry.ComputerName = $ComputerName;
$Entry.Name = $DisplayName.Trim();
$Entry.Publisher = $SubKeyWow6432Node.GetValue("Publisher");
[ref]$ParsedInstallDate = Get-Date
If ([DateTime]::TryParseExact($SubKeyWow6432Node.GetValue("InstallDate"),"yyyyMMdd",$Null,[System.Globalization.DateTimeStyles]::None,$ParsedInstallDate)){
$Entry.InstallDate = $ParsedInstallDate.Value
}
$Entry.EstimatedSize = [Math]::Round($SubKeyWow6432Node.GetValue("EstimatedSize")/1KB,1);
$Entry.Version = $SubKeyWow6432Node.GetValue("DisplayVersion");
$Entry.Wow6432Node = $True;
[Void]$Results.Add($Entry);
}
}
}
}
}
}
$Results
}
Function ListMSHotfix
{
$outputs = Invoke-Expression "wmic qfe list"
$outputs = $outputs[1..($outputs.length)]
foreach ($output in $Outputs) {
if ($output) {
$output = $output -replace 'y U','y-U'
$output = $output -replace 'NT A','NT-A'
$output = $output -replace '\s+',' '
$parts = $output -split ' '
if ($parts[5] -like "*/*/*") {
$Dateis = [datetime]::ParseExact($parts[5], '%M/%d/yyyy',[Globalization.cultureinfo]::GetCultureInfo("en-US").DateTimeFormat)
} elseif (($parts[5] -eq $null) -or ($parts[5] -eq ''))
{
$Dateis = [datetime]1700
}
else {
$Dateis = get-date([DateTime][Convert]::ToInt64("$parts[5]", 16))-Format '%M/%d/yyyy'
}
New-Object -Type PSObject -Property @{
KBArticle = [string]$parts[0]
Computername = [string]$parts[1]
Description = [string]$parts[2]
FixComments = [string]$parts[6]
HotFixID = [string]$parts[3]
InstalledOn = Get-Date($Dateis)-format "dddd d MMMM yyyy"
InstalledBy = [string]$parts[4]
InstallDate = [string]$parts[7]
Name = [string]$parts[8]
ServicePackInEffect = [string]$parts[9]
Status = [string]$parts[10]
}
}
}
}
function MSOfficePatchCheck
{
$a = Get-WmiObject -Class "win32_quickfixengineering"
Write-Output $a
}
Кажется, что Get-WmiObject
является распространенной темой среди них, но некоторые из моих функций, которые работают, используют тот же командлет.Снова ALL функции работают с консоли PS, но некоторые не работают с графическим интерфейсом.Есть идеи?