0 Replies Latest reply on Oct 28, 2017 12:55 PM by ITaaP

    PowerShell GUI to Get VM Info

    ITaaP Enthusiast

      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.