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=$trueallows using a property name from the pipeline.
- Both ValueFromPipeLine and ValueFromPipelineByPropertyName can be used on a single parameter.
- Add SupportsShouldProcess=$Trueto 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.
- PSModulePathcontains 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:COMPUTERNAMEshould 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")
