Powershell Notes - Advanced Automated Administration Class

Thu, Jun 6, 2019 3-minute read

These are my notes from the Global Knowledge “Advanced Automated Administration with Powershell” class. Class ran from 2019-06-03 to 2019-06-05.

Advanced Functions and Parameter blocks
  • Add [CmdletBinding()] to the head of the function or script.
    Parameter block example:
Param(
    $ParamOne, #No type or conditions
    [string]$ParamTwo, # parameter expects a string
    [string]$ParamThree = "DefaultValue", # Parameter expects a string, and defaults to "DefaultValue" if no value is provided.
    [Parameter(Mandatory=$true)]
    [string]$ParamFour, # Sets parameter to mandatory.  $True is not required as adding Mandatory assumes true.
)
  • [string[]] allows multiple string inputs and requires logic in script to handle; ex: multiple computer names.
  • [ValidateCount(start,end)] sets a min and max number of inputs to a parameter.
  • [ValidateSet()] Validates only items in the list can be used and are available via tab completion.
  • [ValidateScript({True or False script block})] Validate a script block, which evaluates to True or False.
  • Add ```ValueFromPipeLine=$true`` to parameter allows accepting a value from the pipeline for a specific paramater.
  • Add ValueFromPipelineByPropertyName=$true allows using a property name from the pipeline.
  • Both ValueFromPipeLine and ValueFromPipelineByPropertyName can be used on a single parameter.
  • Add SupportsShouldProcess=$True to Cmdletbinding() to enable -whatif parameter.
  • Add ConfirmImpact="level" to CmdletBinding() enables -confirm.
  • ConfirmImpact Levels are “High”, “Medium”, “Low”. Example:
    [ValidateScript({
        If(Test-Path(Split-Path $_)){
            $True
        }
        else {
            Throw "Could not find $_"
            }
    })]

Script Modules
  • Modules end in .psm1 and are only renamed ps1 files.
  • PSModulePath contains the paths to script modules.
  • Module name and the directory name must match if not using a module manifest.
    Import-Module ModuleName.psm1 # Import Module
    Remove-Module ModuleName # Remove Module
    dir function: # List install modules
    Get-command # List all available commands

Module Manifest

Example: New-ModuleManifest -Path Path\To\File.psd1 -RootModule FileName.psm1 # Generate a Module Manifest

  • Recommended to use module manifest for more fine grained control over the module.
  • In the manifest, ```FunctionToExport`` change be changed to limit the functions exposed to users. The other internal functions would still be available for the exposed functions to use.
  • Validate a module manifest with Test-ModuleManifest
General Info
  • Backtick (`) without a trailing space breaks a command to the next line.
  • Multiple function parameters can be broken onto separate lines with a backtick without a trailing space.
  • The best place to break multiple pipes is right after the pipe (|) symbol and does not require a backtick.
  • “.” references the localhost.
  • Works for most Powershell commands, but a few it won’t work with.
  • It would not display the name of the local computer. If the computer name needs to be display, $env:COMPUTERNAME should be used instead.
Positional Parameters
  • Follow the order of the parameters defined in the function or script.
  • Rearranging the order of the parameters changes the order.
WMI Examples
  • Select all Win32_LogicalDisk properties from local computer: Get-WmiObject Win32_LogicalDisk
  • Select all logical disks from computer Alpha: Get-WmiObject Win32_LogicalDisk -ComputerName Alpha
  • Select Logical disks from Alpha with drive type 3: Get-WmiObject Win32_LogicalDisk -ComputerName Alpha | Where-Object { $_.DriveType -eq 3}
Where-Object

There are two basic formats:

  • Simple: Where-Object DriveType -eq 3
  • Advanced: Where-Object { $_.DriveType -eq 3} The advanced format allows more complex selection critiera including logical AND/OR, while the simple syntax does not support more than a single condition.
Comments
  • The .Parameter does not have to be used in the comment based help. The parameters for a function can be directly documented, instead of using .Parameter. This can simply documenting and prevent missed .Parameter comments.
.Net and Powershell
[math]::Abs(number) #ABS of a number
[math]::Sin(number) #SIn of a number
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") # Load Windows forms
[SystemWindows.Form.MessageBox]::Show("Text") # Display a Windows forms message box
[System.Environment]::MachineName # Get computer name
[System.Environment]::OsVersion # Get OS version
[System.Diagnosics.Process]::GetProcesses() # Get running processes
[System.Diagnosics.Process]::GetCurrentProcess() # Get process info from current shell
# Speech Synth
Add-Type -AssemblyName Speech.Synthesis
$speech = New-Object System.Synthesis.SpeechSynthesizer
$speech.Speak("Hello World")