Невозможно выполнить графический интерфейс PowerShell с помощью wpf - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь создать графический интерфейс (простая кнопка одним щелчком мыши) для некоторых повседневных задач, которые мы должны выполнять на работе. Я начал с проверки места на диске .ps1 скрипт, встроенный в графический интерфейс, как показано ниже

Add-Type -AssemblyName PresentationFramework

[xml]$XAMLWindow = '
<Window 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        Title="Windows Management Tool" Height="450" Width="600" Background="Gray">
    <Grid>

        <Button Name="DiskSpace" Content="Check Available Disk Space" HorizontalAlignment="Left" Height="43" Margin="56,194,0,0" VerticalAlignment="Top" Width="181"/>


           </Grid>
</Window>

'

$Reader=(New-Object System.Xml.XmlNodeReader $XAMLWindow)
$Window=[Windows.Markup.XamlReader]::Load( $Reader )


$DiskSpace = $Window.FindName('DiskSpace')



$DiskSpace.Add_Click({
.\checkDiskSpaceOnMulti.ps1
})


$Window.ShowDialog() | Out-Null

Ниже приведен код для checkDiskSpaceOnMulti.ps1, который я встроил в GUI

$file = get-Content C:\list.txt  

foreach ( $args in $file) { 
get-WmiObject win32_logicaldisk -ComputerName $args -Filter "Drivetype=3"  |  
ft SystemName,DeviceID,VolumeName,@{Label="Total SIze";Expression={$_.Size / 1gb -as [int] }},@{Label="Free Size";Expression={$_.freespace / 1gb -as [int] }} -autosize 
} 

и когда я нажимаю кнопку в графическом интерфейсе, я получаю ошибку ниже. checkDiskSpaceOnMulti.ps1 работает отлично, как мне нужно, при использовании из powershell ISE. Проблема только при использовании со скриптом GUI.

.\checkDiskSpaceOnMulti.ps1 : The term '.\checkDiskSpaceOnMulti.ps1' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try 
again.
At H:\Powershell\Powershell\Windows_Utility_Tool.ps1:54 char:1
+ .\checkDiskSpaceOnMulti.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (.\checkDiskSpaceOnMulti.ps1:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Также предложите мне хороший инструмент для разработки PoSh GUI.

1 Ответ

0 голосов
/ 16 июня 2019

Возможно, вам лучше использовать многострочное текстовое поле, используя моноширинный шрифт в окне, чтобы показать результаты.Кроме того, поскольку выполняемый код довольно мал, я бы поместил его в функцию и запустил ее по нажатию кнопки:

Add-Type -AssemblyName PresentationFramework

[xml]$XAMLWindow = @'
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        Title="Windows Management Tool" Height="450" Width="600" Background="Gray">

    <Grid Margin="0,10,0,0">

        <TextBox Name="ResultBox" Height="300" Width="500" TextWrapping="Wrap" 
                 AcceptsReturn="True" VerticalScrollBarVisibility="Auto" FontFamily="Consolas"
                 VerticalAlignment="Top" Margin="0,20,0,0"/>

        <Button Name="DiskSpace" Content="Check Available Disk Space" HorizontalAlignment="Left" 
                Height="43" Margin="40,330,0,0" VerticalAlignment="Top" Width="181"/>

    </Grid>
</Window>
'@

$Reader = New-Object System.Xml.XmlNodeReader $XAMLWindow
$Window = [Windows.Markup.XamlReader]::Load($Reader)

function checkDiskSpaceOnMulti {
    $textBox = $Window.FindName("ResultBox")
    $textBox.Clear()

    # read the file as string array and skip empty lines
    # UPDATE: force the result of Get-Content to be an array if only one computer is listed
    $file = @(Get-Content 'C:\list.txt') | Where-Object { $_ -match '\S' }

    # fill the textbox with the results
    $textBox.Text = foreach ($computer in $file) {
        # add a test to see if the computer can be reached
        if (Test-Connection -ComputerName $computer -Count 1 -Quiet) {
            Get-WmiObject -Class Win32_LogicalDisk -ComputerName $computer -Filter "Drivetype=3" |
            Format-Table SystemName, DeviceID, VolumeName,
                         @{Label="Total Size";Expression={$_.Size / 1gb -as [int] }},
                         @{Label="Free Size" ;Expression={$_.Freespace / 1gb -as [int] }} -AutoSize | Out-String
        }
        else {
            "WARNING: Computer '$computer' is off-line or does not exist.`r`n"
        }
    }
}

$DiskSpace = $Window.FindName("DiskSpace")
$DiskSpace.Add_Click({ checkDiskSpaceOnMulti })

$Window.ShowDialog() | Out-Null

Приведенное выше окно приведет к появлению такого окна:

enter image description here

Надеюсь, что поможет

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