====== Powershell Cheat Sheet ====== ===== File exists check ===== if (Test-Path $path) { Write-Host "File exists." } if (!(Test-Path $path)) { Write-Host "File does not exist." } ===== Check previous command was successful ===== if ($?) { Write-Host 'Success' -ForegroundColor Green } else { Write-Host 'FAILED' -ForegroundColor Red throw 'Failed.' } ===== Searching in files ===== Get-ChildItem -Recurse -Path C:\Temp -Include *.txt | Select-String 'This', 'OR that' | Select-String 'AND this' | Format-Table -property path, line -autosize | Out-String -Width 4096 ===== Search and replace in a file ===== (Get-Content $filename) -replace 'heise', 'Heise' | Set-Content $filename ===== Create a timestamp ===== $timestamp = (Get-Date).ToString("yyyyMMdd HHmmssff") ===== Parameters ===== param ( [parameter(Mandatory=$true,HelpMessage='The target server')] [string]$targetServer, [parameter(Mandatory=$true)] [string]$targetWebConfig, [parameter(Mandatory=$false)] [string]$build = 'debug' ) ===== Set current directory to script location ===== Push-Location "$($MyInvocation.MyCommand.Path)\..\" #... Pop-Location ===== Certificates ===== Search by thumbprint: Get-ChildItem -Path Cert: -Recurse | Where-Object { $_.Thumbprint -and $_.Thumbprint.ToLower().StartsWith('c4') } To check if the cert is valid, pipe it the ''Test-Certificate'' command: Get-ChildItem -Path Cert: -Recurse | Where-Object { $_.Thumbprint -and $_.Thumbprint.ToLower().StartsWith('c4') } | Test-Certificate To check for expired / revoked certs: $certs = Get-ChildItem -Path Cert:\LocalMachine\My -Recurse foreach ($cert in $certs) { Write-Host "$($cert.Thumbprint) $($cert.Subject)" if ($certs.NotAfter -lt (Get-Date)) { Write-Host " Expired on $($certs.NotAfter)" -ForegroundColor Red } elseif ($cert | Test-Certificate) { Write-Host " Tested ok." -ForegroundColor Green } } ===== Get Install-Module working behind a webproxy ===== - Run ''notepad $PROFILE''. - Add this to the top: # Uncomment this to use PowerShellGet #$Username="global\heises" #$Password="password" #[system.net.webrequest]::defaultwebproxy = new-object system.net.webproxy('http://10.104.66.70:80') #[system.net.webrequest]::defaultwebproxy.credentials = New-Object System.Net.NetworkCredential($Username, $Password) #[system.net.webrequest]::defaultwebproxy.BypassProxyOnLocal = $true - Uncomment, fill out the details, and save. - Start a //new// Powershell session. - Run ''Register-PSRepository -Default'' - Run ''Get-PSRepository'' again to verify. - Once installation is complete, comment out commands and change password. If this doesn't work, and it won't for an ANZ Dev VM, try the [[powershell_manual_module_installation|PowerShell Manual Module Installation]]. ===== No Sleep ===== May only work inside Windows Powershell ISE. $intervalSeconds = 60 $mouseDistance = 1 $myshell = New-Object -com "Wscript.Shell" while ($true) { Start-Sleep -Seconds $intervalSeconds $Pos = [System.Windows.Forms.Cursor]::Position [System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point((($Pos.X) + $mouseDistance) , $Pos.Y) [System.Windows.Forms.SendKeys]::SendWait("{f15}") Write-Host 'A shuffle to the right.' Start-Sleep -Seconds $intervalSeconds $Pos = [System.Windows.Forms.Cursor]::Position [System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point((($Pos.X) - $mouseDistance) , $Pos.Y) [System.Windows.Forms.SendKeys]::SendWait("{f15}") Write-Host 'A shuffle to the left.' } ===== Text Processing ===== ==== Simple replace (supports regexs) ==== '1234abcd' -replace '\d', '*' # ****abcd ==== Simple match (supports regexs) ==== '123.456.789.123' -match '\d+(?:\.\d+){2}' # returns true if there is a match. $Matches.Values # = '123.456.789' ==== Filter lines by regex ==== $inputText = '!! Match me Not me !! Match me too Not me tho' $regex=[regex] '(?m)^!!.+?$' $regex.matches($inputText) | Foreach-Object { $_.Value } # Returns a string, one match per line. ==== Reformatting by using regex groups ==== # Filter lines by regex. $inputText = ' .. . . left:10 . .. right:10 ... .. . . left:20 . .. right:20 ... .. . left:30 . . ... .. right:30 ... left:40right:40' -replace "`r`n", "`n" $regex=[regex] '(?m)^[ \.]*(?left:\d+)[ \.]*(?right:\d+)[ \.]*$' $regex.matches($inputText) | Foreach-Object { $_.Groups["left"].value + ' - ' + $_.Groups["right"].value} # Returns a string: #left:10 - right:10 #left:20 - right:20 #left:30 - right:30 #left:40 - right:40 ==== Regex groups ==== $regex=[regex] ('-rw-rw---- 1 root sdcard_rw (?\d+) (?\d\d\d\d-\d\d-\d\d \d\d:\d\d) (?.*)$') $input='-rw-rw---- 1 root sdcard_rw 358 2019-09-01 19:50 /storage/emulated/0/Podcasts/Sync Test/New folder/rua.txt' $matches = $regex.matches($input) if (!($matches.Success)) { Write-Host "Regex failed to match: $input" -ForegroundColor Red Exit(-1) } Write-Host "length = $($matches.Captures.Groups["length"].value)" Write-Host "date = $($matches.Captures.Groups["date"].value)" Write-Host "filename = $($matches.Captures.Groups["filename"].value)" ==== Regex replace with groups ==== # $1 = group 1, $2 = group 2, etc. '123 456 789' -replace '(\d+ )(\d+)( \d+)', '$1!$2!$3' # = '123 !456! 789' ==== Pipeline function ==== function Replace-String { [cmdletbinding()] Param ( [parameter(ValueFromPipeline)] [string]$Input, [string]$OldValue, [string]$NewValue ) Process { $Input -replace $OldValue, $NewValue } } 'djkslajklfdsjkl' | Replace-String -OldValue 'd' -NewValue 'x'