====== 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'