Automation

 View Only

PowerShell GUI to Get VM Info

  • 1.  PowerShell GUI to Get VM Info

    Posted Oct 28, 2017 07:56 PM
      |   view attached

    I am trying to do multiple things from a GUI interface, but figured I would start with something easy such as connecting to vCenter and getting a VM. Apparently not so easy. For reference on making the GUI in the first place, I was using this. https://foxdeploy.com/2015/04/16/part-ii-deploying-powershell-guis-in-minutes-using-visual-studio/

    Here is the code I ended up with.

    #ERASE ALL THIS AND PUT XAML BELOW between the @" "@

    $inputXML = @"

    <Window x:Class="WpfApplication2.MainWindow"

            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

            xmlns:local="clr-namespace:WpfApplication2"

            mc:Ignorable="d"

            Title="PowerShell GUI" Height="345.992" Width="530.344" Topmost="True">

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

            <Image x:Name="image" HorizontalAlignment="Left" Height="100" Margin="24,28,0,0" VerticalAlignment="Top" Width="100" Source="C:\vcap.jpg"/>

            <TextBlock x:Name="textBlock" HorizontalAlignment="Left" Height="100" Margin="174,28,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="282" FontSize="16" Text="This is my first PowerShell GUI"/>

            <Button x:Name="button" Content="OK" HorizontalAlignment="Left" Height="55" Margin="367,254,0,0" VerticalAlignment="Top" Width="102" FontSize="18.667"/>

            <TextBox x:Name="vmname" HorizontalAlignment="Left" Height="35" Margin="223,196,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="168" FontSize="16"/>

            <Label x:Name="vm" Content="VM Name" HorizontalAlignment="Left" Height="46" Margin="56,196,0,0" VerticalAlignment="Top" Width="138" FontSize="16"/>

            <Label x:Name="vc" Content="vCenter Server" HorizontalAlignment="Left" Height="46" Margin="56,146,0,0" VerticalAlignment="Top" Width="138" FontSize="16"/>

            <TextBox x:Name="vcenter" HorizontalAlignment="Left" Height="35" Margin="223,150,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="168" FontSize="16"/>

        </Grid>

    </Window>

    "@      

    $inputXML = $inputXML -replace 'mc:Ignorable="d"','' -replace "x:N",'N'  -replace '^<Win.*', '<Window'

    [void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')

    [xml]$XAML = $inputXML

    #Read XAML

        $reader=(New-Object System.Xml.XmlNodeReader $xaml)

      try{$Form=[Windows.Markup.XamlReader]::Load( $reader )}

    catch{Write-Host "Unable to load Windows.Markup.XamlReader. Double-check syntax and ensure .net is installed."}

    #===========================================================================

    # Load XAML Objects In PowerShell

    #===========================================================================

    $xaml.SelectNodes("//*[@Name]") | %{Set-Variable -Name "WPF$($_.Name)" -Value $Form.FindName($_.Name)}

    Function Get-FormVariables{

    if ($global:ReadmeDisplay -ne $true){Write-host "If you need to reference this display again, run Get-FormVariables" -ForegroundColor Yellow;$global:ReadmeDisplay=$true}

    write-host "Found the following interactable elements from our form" -ForegroundColor Cyan

    get-variable WPF*

    }

    Get-FormVariables

    #===========================================================================

    # Actually make the objects work

    #===========================================================================

    $WPFbutton.Add_Click({

    $userInput = $WPFvmname.text

    $userInput = $WPFvcenter.text

    $form.Close()

    Connect-VIServer $WPFvcenter.Text

    Get-VM $WPFvmname.text

    })

    #Sample entry of how to add data to a field

    #$vmpicklistView.items.Add([pscustomobject]@{'VMName'=($_).Name;Status=$_.Status;Other="Yes"})

    #===========================================================================

    # Shows the form

    #===========================================================================

    write-host "To show the form, run the following" -ForegroundColor Cyan

    $Form.ShowDialog() | out-null

    The GUI works fine and I am able to enter in the vCenter server and name of a VM. Next the script connects to vCenter, but the Get-VM command doesn't do anything. The only time I can get Get-VM to work is if I manually enter in "Get-VM $WPFvmname.text".

    Ultimately if I can get this working, I want to use it for creating folders, resource pools, distributed port groups with VLAN, etc.