Powershell GUI для пользователей для вызова функций - PullRequest
0 голосов
/ 07 июня 2018

Я хочу, чтобы пользователь мог выбрать функции, которые он хочет запустить, и затем нажать кнопку, чтобы просмотреть вывод.

У меня он работает для большинства моих функций, но некоторые из них неКажется, что завершено.Я в основном создаю массив с именами всех функций, которые они выбирают, и затем использую цикл 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, но некоторые не работают с графическим интерфейсом.Есть идеи?

1 Ответ

0 голосов
/ 07 июня 2018

Я бы порекомендовал, используя более прямой подход к проблеме.

Ради проверки работоспособности выделите каждую из ваших функций в отдельный файл .ps1.

Putкаждый из этих файлов .ps1 в той же папке.

Используйте простой вызов Get-ChildItem, переданный в Out-GridView (как ваш графический интерфейс).Выберите нужные функции из OGV и обработайте их в ForLoop.

$RunActions = Get-ChildItem -Path D:\Scripts\*.* | Out-GridView -Title 'Select the action items to run' -PassThru
$RunActions.Fullname | %{ &$_}

Вот статья, о которой я говорю более подробно.

Создание упрощенного графического интерфейса пользователяИнтерфейс с Out-GridView http://mikefrobbins.com/2014/09/11/creating-a-simplistic-gui-interface-with-out-gridview

Если они запускаются с помощью этого простого подхода, то его можно использовать в качестве проверки / указателя / индикатора для просмотра другой части изображения, которая может быть основной причиной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...