Powershell Notes - Advanced Automated Administration Class
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")
Debugging
Write-Verbose
- Write-versobse can be used instead of Write-host.
- Enabled via
[CmdletBinding()]
. - Only would activate when using the -verbose flag.
Write-Debug - Enabled via
[CmdletBinding()]
- Activated with -Debug
- Stops script execution when triggered.
Breakpoints - Breakpoints can be set on a line number, on a variable, or on a command.
- Variable breakpoints will trigger every time the variable is used.
- Ex:
Set-PSBreakPoint -Variable VariableName -Mode ReadWrite -Script ScriptName