LEARN with scripting TRAINING CREATE with SCRIPTING TOOLS SHARE in a COMMUNITY BUY Scripting Products

SAPIEN Solutions

SAPIEN homepage
SAPIEN Software
PrimalScript script editor+ide
PrimalScope script debugger
Free Tools script utilities
SAPIEN Press tech books
ScriptingAnswers.com learn+share
ScriptingOutpost.com online store
Blog.Sapien.com official blog
Contact Us

 

Getting Started with PrimalForms

drivereport I hope you are as excited about the release of PrimalForms as I am. In the past creating a Windows form in PowerShell was a very tedious task and one I rarely used except for the most simplest of forms. No more. The free PrimalForms tool lets me create a very rich Windows form using a WYSIWYG editor. I can export the form to a file, add my PowerShell code and call it a day.

Start:

The first time you launch the tool, I strongly encourage you to also click the Getting Started and spend a few minutes going through the Getting Started guide. It will walk you through PrimalForms as well as creating a PowerShell script. I’ve also provided several sample forms and associated scripts. While you could use them in a production environment (after testing of course), they are primarily intended as samples.

Remember, PrimalForms only generates PowerShell code to present the form. If you associate an event with a control, like Click with a button control, the generated PowerShell code will define script blocks. All you have to do is add your PowerShell code. Windows PowerShell v1.0: TFM 2nd Edition has additional information on creating and using Windows Forms with PowerShell.

If you have issues using the tool itself, there is a free tools support forum at SAPIEN.com. If you need help developing a PowerShell script from your form, please use the PowerShell forum at ScriptingAnswers.com.

Sample:

To get you started and perhaps whet your appetite, here is another PrimalForms-generated script. The script gets all the logical disks for a specified computer using WMI and displays useful information. A progress bar will give you a graphical representation of how much free space is left on the drive.

   1: #DriveInfo.ps1
   2: #v1.0 11/3/2008
   3: #Jeffery Hicks jhicks@sapien.com
   4: #http://www.scriptingAnswers.com
   5:
   6: #USAGE: .\driveinfo.ps1
   7:
   8: # ****************************************************************
   9: # * DO NOT USE IN A PRODUCTION ENVIRONMENT UNTIL YOU HAVE TESTED *
  10: # * IN A SECURED LAB ENVIRONMENT. USE AT YOUR OWN RISK.          * 
  11: # ****************************************************************
  12:
  13: Function Get-Drives {
  14:  Param([string]$computername=$env:computername)
  15:
  16:  #don't display any error messages
  17:  $drives=Get-WmiObject Win32_logicaldisk -computername $computername `
  18:  -filter "drivetype=3" -ea "SilentlyContinue"
  19:
  20:  foreach ($drive in $drives) {
  21:     write $drive.deviceID
  22:  }
  23:
  24: }
  25:
  26: Function Get-DriveInfo {
  27:     Param([string]$computername=$env:computername,
  28:            [string]$drive="c:"
  29:            )
  30:
  31:   $logical=get-wmiobject win32_logicaldisk -computername $computername -filter "deviceid='$drive'"
  32:   $partition= get-wmiobject -computername $computername `
  33:   -query "associators of {win32_logicaldisk.deviceid='$drive'} where resultclass=win32_diskpartition"
  34:
  35:   $obj=New-Object PSObject
  36:   $obj | Add-Member Noteproperty "DeviceId" $logical.DeviceID
  37:   $obj | Add-Member Noteproperty "VolumeName" $logical.VolumeName
  38:   $obj | Add-Member Noteproperty "VolumeSerialNumber" $logical.VolumeSerialNumber
  39:   $obj | Add-Member Noteproperty "PrimaryPartition" $partition.PrimaryPartition
  40:   $obj | Add-Member Noteproperty "NumberOfBlocks" $partition.NumberofBlocks
  41:   $obj | Add-Member Noteproperty "BlockSize" $partition.blocksize
  42:   $obj | Add-Member Noteproperty "BootPartition" $partition.BootPartition
  43:   $obj | Add-Member Noteproperty "Compressed" $logical.Compressed
  44:   $obj | Add-Member Noteproperty "Filesystem" $logical.FileSystem
  45:   $obj | Add-Member Noteproperty "Size(MB)" ($logical.Size/1MB -as [int])
  46:   $obj | Add-Member Noteproperty "Freespace(MB)" ($logical.Freespace/1MB -as [int])
  47:   $obj | Add-Member Noteproperty "PercentFree" (([double]$logical.freespace/[double]$logical.size)*100 -as [int])
  48:   $obj | Add-Member Noteproperty "PartitionSize(MB)" ($partition.size/1MB -as [int])
  49:
  50:   write $obj
  51: }
  52:
  53: ########################################################################
  54: # Code Generated By: SAPIEN Technologies PrimalForms 2009 v1.0.0.0
  55: # Generated On: 11/3/2008 10:39 AM
  56: # Generated By: Jeffery Hicks
  57: ########################################################################
  58:
  59: #region Import the Assembles
  60: [reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
  61: [reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
  62: #endregion
  63:
  64: #region Generated Form Objects
  65: $form1 = New-Object System.Windows.Forms.Form
  66: $linkLabel1 = New-Object System.Windows.Forms.LinkLabel
  67: $btnGetInfo = New-Object System.Windows.Forms.Button
  68: $richTextBox1 = New-Object System.Windows.Forms.RichTextBox
  69: $btnClose = New-Object System.Windows.Forms.Button
  70: $comboDrives = New-Object System.Windows.Forms.ComboBox
  71: $statusBar = New-Object System.Windows.Forms.StatusBar
  72: $lblDrive = New-Object System.Windows.Forms.Label
  73: $progUsage = New-Object System.Windows.Forms.ProgressBar
  74: $txtComputerName = New-Object System.Windows.Forms.TextBox
  75: #endregion Generated Form Objects
  76:
  77: #----------------------------------------------
  78: #Generated Event Script Blocks
  79: #----------------------------------------------
  80: #Provide Custom Code for events specified in PrimalForms.
  81: $CloseForm=
  82: {
  83: $form1.close()
  84: }
  85:
  86: $OpenDrive=
  87: {
  88: [system.Diagnostics.Process]::start("Explorer",$linkLabel1.text)
  89: }
  90:
  91: $GetDriveInfo=
  92: {
  93: $statusBar.Text=("Getting drive details for {0} on {1}" -f $comboDrives.SelectedItem,$txtComputerName.text)
  94:
  95: $driveData=Get-DriveInfo -computername $txtComputerName.Text -drive $comboDrives.SelectedItem
  96:
  97: #set drive label to selected DeviceID
  98: $lblDrive.text=$driveData.DeviceID
  99:
 100: #build report data and convert to string
 101: $report=$driveData | Format-List |Out-String
 102:
 103: #set richtext box text to report data
 104: $richTextBox1.Text=$report.Trim()
 105:
 106: $progUsage.Value=$driveData.PercentFree
 107:
 108: $linkLabel1.text="\\{0}\{1}" -f $txtComputerName.Text.ToUpper(),$driveData.DeviceID.Replace(":","$")
 109:
 110: $statusBar.Text="Ready"
 111:
 112: }
 113:
 114: $GetDrives=
 115: {
 116: $statusBar.Text=("Getting fixed logical drives for {0}" -f $txtComputername.text.toUpper())
 117:
 118: #clear richTextBox
 119: $richTextBox1.text=$Null
 120:
 121: $collDrives=Get-Drives $txtComputerName.Text
 122: if ($collDrives) {
 123: #only proceed if a connection was made to the computer
 124:     #clear the drive dropdown of any existing values
 125:     $comboDrives.Items.Clear()
 126:
 127:     #populate the drive dropdown
 128:     foreach ($drive in $collDrives) {
 129:       $comboDrives.Items.add($drive)
 130:     }
 131:     $comboDrives.SelectedIndex=0
 132:     $comboDrives.Enabled=$True
 133:
 134:     &$GetDriveInfo
 135: }
 136: else
 137: {
 138: $richTextBox1.text=("Failed to get drives for {0}" -f $txtComputerName.Text.ToUpper())
 139: $comboDrives.Items.Clear()
 140: $comboDrives.Text="N/A"
 141: $progUsage.value=0
 142: $lblDrive="N/A"
 143: $linkLabel1.text="N/A"
 144: }
 145:
 146: $statusBar.Text="Ready"
 147:
 148: }
 149:
 150: #----------------------------------------------
 151: #region Generated Form Code
 152: $form1.Name = 'form1'
 153: $form1.Text = 'Drive Report'
 154: $form1.DataBindings.DefaultDataSourceUpdateMode = 0
 155: $form1.FormBorderStyle = 1
 156: $System_Drawing_Size = New-Object System.Drawing.Size
 157: $System_Drawing_Size.Width = 284
 158: $System_Drawing_Size.Height = 333
 159: $form1.ClientSize = $System_Drawing_Size
 160: $form1.add_Load($GetDrives)
 161:
 162: $linkLabel1.TabIndex = 7
 163: $linkLabel1.Text = 'open'
 164: $linkLabel1.TabStop = $True
 165: $linkLabel1.Name = 'linkLabel1'
 166: $System_Drawing_Point = New-Object System.Drawing.Point
 167: $System_Drawing_Point.X = 151
 168: $System_Drawing_Point.Y = 48
 169: $linkLabel1.Location = $System_Drawing_Point
 170: $linkLabel1.TextAlign = 32
 171: $System_Drawing_Size = New-Object System.Drawing.Size
 172: $System_Drawing_Size.Width = 100
 173: $System_Drawing_Size.Height = 23
 174: $linkLabel1.Size = $System_Drawing_Size
 175: $linkLabel1.DataBindings.DefaultDataSourceUpdateMode = 0
 176: $linkLabel1.add_Click($OpenDrive)
 177:
 178: $form1.Controls.Add($linkLabel1)
 179:
 180: $btnGetInfo.UseVisualStyleBackColor = $True
 181: $btnGetInfo.Text = 'Get Drives'
 182: $btnGetInfo.DataBindings.DefaultDataSourceUpdateMode = 0
 183: $btnGetInfo.TabIndex = 1
 184: $btnGetInfo.Name = 'btnGetInfo'
 185: $System_Drawing_Size = New-Object System.Drawing.Size
 186: $System_Drawing_Size.Width = 75
 187: $System_Drawing_Size.Height = 23
 188: $btnGetInfo.Size = $System_Drawing_Size
 189: $System_Drawing_Point = New-Object System.Drawing.Point
 190: $System_Drawing_Point.X = 197
 191: $System_Drawing_Point.Y = 13
 192: $btnGetInfo.Location = $System_Drawing_Point
 193: $btnGetInfo.add_Click($GetDrives)
 194:
 195: $form1.Controls.Add($btnGetInfo)
 196:
 197: $richTextBox1.Text = ''
 198: $richTextBox1.TabIndex = 6
 199: $richTextBox1.Name = 'richTextBox1'
 200: $richTextBox1.Font = New-Object System.Drawing.Font("Lucida Console",8.25,0,3,1)
 201: $richTextBox1.BackColor = [System.Drawing.Color]::FromArgb(255,240,240,240)
 202: $richTextBox1.ReadOnly = $True
 203: $richTextBox1.BorderStyle = 0
 204: $System_Drawing_Size = New-Object System.Drawing.Size
 205: $System_Drawing_Size.Width = 259
 206: $System_Drawing_Size.Height = 159
 207: $richTextBox1.Size = $System_Drawing_Size
 208: $richTextBox1.DataBindings.DefaultDataSourceUpdateMode = 0
 209: $System_Drawing_Point = New-Object System.Drawing.Point
 210: $System_Drawing_Point.X = 13
 211: $System_Drawing_Point.Y = 78
 212: $richTextBox1.Location = $System_Drawing_Point
 213:
 214: $form1.Controls.Add($richTextBox1)
 215:
 216: $btnClose.UseVisualStyleBackColor = $True
 217: $btnClose.Text = 'Close'
 218: $btnClose.DataBindings.DefaultDataSourceUpdateMode = 0
 219: $btnClose.TabIndex = 3
 220: $btnClose.Name = 'btnClose'
 221: $System_Drawing_Size = New-Object System.Drawing.Size
 222: $System_Drawing_Size.Width = 75
 223: $System_Drawing_Size.Height = 23
 224: $btnClose.Size = $System_Drawing_Size
 225: $System_Drawing_Point = New-Object System.Drawing.Point
 226: $System_Drawing_Point.X = 102
 227: $System_Drawing_Point.Y = 282
 228: $btnClose.Location = $System_Drawing_Point
 229: $btnClose.add_Click($CloseForm)
 230:
 231: $form1.Controls.Add($btnClose)
 232:
 233: $comboDrives.Name = 'comboDrives'
 234: $System_Drawing_Size = New-Object System.Drawing.Size
 235: $System_Drawing_Size.Width = 121
 236: $System_Drawing_Size.Height = 21
 237: $comboDrives.Size = $System_Drawing_Size
 238: $comboDrives.FormattingEnabled = $True
 239: $comboDrives.Enabled = $False
 240: $comboDrives.TabIndex = 2
 241: $System_Drawing_Point = New-Object System.Drawing.Point
 242: $System_Drawing_Point.X = 13
 243: $System_Drawing_Point.Y = 50
 244: $comboDrives.Location = $System_Drawing_Point
 245: $comboDrives.DataBindings.DefaultDataSourceUpdateMode = 0
 246: $comboDrives.add_SelectedIndexChanged($GetDriveInfo)
 247:
 248: $form1.Controls.Add($comboDrives)
 249:
 250: $statusBar.Name = 'statusBar'
 251: $statusBar.DataBindings.DefaultDataSourceUpdateMode = 0
 252: $statusBar.TabIndex = 3
 253: $System_Drawing_Size = New-Object System.Drawing.Size
 254: $System_Drawing_Size.Width = 284
 255: $System_Drawing_Size.Height = 22
 256: $statusBar.Size = $System_Drawing_Size
 257: $System_Drawing_Point = New-Object System.Drawing.Point
 258: $System_Drawing_Point.X = 0
 259: $System_Drawing_Point.Y = 311
 260: $statusBar.Location = $System_Drawing_Point
 261: $statusBar.Text = 'Ready'
 262:
 263: $form1.Controls.Add($statusBar)
 264:
 265: $lblDrive.Text = 'C:'
 266: $lblDrive.DataBindings.DefaultDataSourceUpdateMode = 0
 267: $lblDrive.TabIndex = 2
 268: $lblDrive.TextAlign = 64
 269: $lblDrive.Name = 'lblDrive'
 270: $System_Drawing_Size = New-Object System.Drawing.Size
 271: $System_Drawing_Size.Width = 32
 272: $System_Drawing_Size.Height = 23
 273: $lblDrive.Size = $System_Drawing_Size
 274: $System_Drawing_Point = New-Object System.Drawing.Point
 275: $System_Drawing_Point.X = 0
 276: $System_Drawing_Point.Y = 243
 277: $lblDrive.Location = $System_Drawing_Point
 278:
 279: $form1.Controls.Add($lblDrive)
 280:
 281: $progUsage.DataBindings.DefaultDataSourceUpdateMode = 0
 282: $progUsage.Style = 1
 283: $progUsage.TabIndex = 1
 284: $progUsage.Name = 'progUsage'
 285: $System_Drawing_Size = New-Object System.Drawing.Size
 286: $System_Drawing_Size.Width = 234
 287: $System_Drawing_Size.Height = 23
 288: $progUsage.Size = $System_Drawing_Size
 289: $progUsage.ForeColor = [System.Drawing.Color]::FromArgb(255,0,255,0)
 290: $progUsage.BackColor = [System.Drawing.Color]::FromArgb(255,255,0,0)
 291: $System_Drawing_Point = New-Object System.Drawing.Point
 292: $System_Drawing_Point.X = 29
 293: $System_Drawing_Point.Y = 243
 294: $progUsage.Location = $System_Drawing_Point
 295:
 296: $form1.Controls.Add($progUsage)
 297:
 298: $txtComputerName.Text = $env:computername
 299: $txtComputerName.Name = 'txtComputerName'
 300: $txtComputerName.TabIndex = 0
 301: $System_Drawing_Size = New-Object System.Drawing.Size
 302: $System_Drawing_Size.Width = 178
 303: $System_Drawing_Size.Height = 20
 304: $txtComputerName.Size = $System_Drawing_Size
 305: $System_Drawing_Point = New-Object System.Drawing.Point
 306: $System_Drawing_Point.X = 13
 307: $System_Drawing_Point.Y = 13
 308: $txtComputerName.Location = $System_Drawing_Point
 309: $txtComputerName.DataBindings.DefaultDataSourceUpdateMode = 0
 310:
 311: $form1.Controls.Add($txtComputerName)
 312:
 313: #endregion Generated Form Code
 314:
 315: #Show the Form