mirror of
https://github.com/adambard/learnxinyminutes-docs.git
synced 2024-12-23 17:41:41 +00:00
190 lines
6.0 KiB
Markdown
190 lines
6.0 KiB
Markdown
---
|
|
category: tool
|
|
tool: powershell
|
|
contributors:
|
|
- ["Wouter Van Schandevijl", "https://github.com/laoujin"]
|
|
filename: LearnPowershell.ps1
|
|
---
|
|
|
|
PowerShell is the Windows scripting language and configuration management framework from Microsoft built on the .NET Framework. Windows 7 and up ship with PowerShell.
|
|
Nearly all examples below can be a part of a shell script or executed directly in the shell.
|
|
|
|
A key difference with Bash is that it is mostly objects that you manipulate rather than plain text.
|
|
|
|
[Read more here.](https://technet.microsoft.com/en-us/library/bb978526.aspx)
|
|
|
|
If you are uncertain about your environment:
|
|
```powershell
|
|
Get-ExecutionPolicy -List
|
|
Set-ExecutionPolicy AllSigned
|
|
# Execution policies include:
|
|
# - Restricted: Scripts won't run.
|
|
# - RemoteSigned: Downloaded scripts run only if signed by a trusted publisher.
|
|
# - AllSigned: Scripts need to be signed by a trusted publisher.
|
|
# - Unrestricted: Run all scripts.
|
|
help about_Execution_Policies # for more info
|
|
|
|
# Current PowerShell version:
|
|
$PSVersionTable
|
|
```
|
|
|
|
Getting help:
|
|
```powershell
|
|
# Find commands
|
|
Get-Command about_* # alias: gcm
|
|
Get-Command -Verb Add
|
|
Get-Alias ps
|
|
Get-Alias -Definition Get-Process
|
|
|
|
Get-Help ps | less # alias: help
|
|
ps | Get-Member # alias: gm
|
|
```
|
|
|
|
The tutorial starts here:
|
|
```powershell
|
|
# As you already figured, comments start with #
|
|
|
|
# Simple hello world example:
|
|
echo Hello world!
|
|
# echo is an alias for Write-Output (=cmdlet)
|
|
# Most cmdlets and functions follow the Verb-Noun naming convention
|
|
|
|
# Each command starts on a new line, or after semicolon:
|
|
echo 'This is the first line'; echo 'This is the second line'
|
|
|
|
# Declaring a variable looks like this:
|
|
$aString="Some string"
|
|
# Or like this:
|
|
$aNumber = 5
|
|
$aList = 1,2,3,4,5
|
|
$aHashtable = @{name1='val1'; name2='val2'}
|
|
|
|
# Using variables:
|
|
echo $aString
|
|
echo "Interpolation: $aString"
|
|
echo "`$aString has length of $($aString.length)"
|
|
echo '$aString'
|
|
echo @"
|
|
This is a Here-String
|
|
$aString
|
|
"@
|
|
# Note that ' (single quote) won't expand the variables!
|
|
# Here-Strings also work with single quote
|
|
|
|
# Builtin variables:
|
|
# There are some useful builtin variables, like
|
|
echo "Booleans: $TRUE and $FALSE"
|
|
echo "Empty value: $NULL"
|
|
echo "Last program's return value: $?"
|
|
echo "Exit code of last run Windows-based program: $LastExitCode"
|
|
echo "The last token in the last line received by the session: $$"
|
|
echo "The first token: $^"
|
|
echo "Script's PID: $PID"
|
|
echo "Full path of current script directory: $PSScriptRoot"
|
|
echo 'Full path of current script: ' + $MyInvocation.MyCommand.Path
|
|
echo "FUll path of current directory: $Pwd"
|
|
echo "Bound arguments in a function, script or code block: $PSBoundParameters"
|
|
echo "Unbound arguments: $($Args -join ', ')." ######################## MOVE THIS TO FUNCTIONS
|
|
# More builtins: `help about_Automatic_Variables`
|
|
|
|
# Reading a value from input:
|
|
$Name = Read-Host "What's your name?"
|
|
echo "Hello, $Name!"
|
|
[int]$Age = Read-Host "What's your age?"
|
|
|
|
# Control Flow
|
|
# We have the usual if structure:
|
|
if ($Age -is [string]) {
|
|
echo 'But.. $Age cannot be a string!'
|
|
} elseif ($Age -lt 12 -and $Age -gt 0) {
|
|
echo 'Child (Less than 12. Greater than 0)'
|
|
} else {
|
|
echo 'Adult'
|
|
}
|
|
|
|
# Switch statements are more powerfull compared to most languages
|
|
$val = "20"
|
|
switch($val) {
|
|
{ $_ -eq 42 } { "The answer equals 42"; break }
|
|
'20' { "Exactly 20"; break }
|
|
{ $_ -like 's*' } { "Case insensitive"; break }
|
|
{ $_ -clike 's*'} { "clike, ceq, cne for case sensitive"; break }
|
|
{ $_ -notmatch '^.*$'} { "Regex matching. cnotmatch, cnotlike, ..."; break }
|
|
{ 'x' -contains 'x'} { "FALSE! -contains is for lists!"; break }
|
|
default { "Others" }
|
|
}
|
|
|
|
# The classic for
|
|
for($i = 1; $i -le 10; $i++) {
|
|
"Loop number $i"
|
|
}
|
|
# Or shorter
|
|
1..10 | % { "Loop number $_" }
|
|
|
|
# PowerShell also offers
|
|
foreach ($var in 'val1','val2','val3') { echo $var }
|
|
# while () {}
|
|
# do {} while ()
|
|
# do {} until ()
|
|
|
|
|
|
# List files and directories in the current directory
|
|
ls # or `dir`
|
|
cd ~ # goto home
|
|
|
|
Get-Alias ls # -> Get-ChildItem
|
|
# Uh!? These cmdlets have generic names because unlike other scripting
|
|
# languages, PowerShell does not only operate in the current directory.
|
|
cd HKCU: # go to the HKEY_CURRENT_USER registry hive
|
|
|
|
# Get all providers in your session
|
|
Get-PSProvider
|
|
|
|
# Cmdlets have parameters that control their execution:
|
|
Get-ChildItem -Filter *.txt -Name # Get just the name of all txt files
|
|
# Only need to type as much of a parameter name until it is no longer ambiguous
|
|
ls -fi *.txt -n # -f is not possible because -Force also exists
|
|
# Use `Get-Help Get-ChildItem -Full` for a complete overview
|
|
|
|
# Results of the previous cmdlet can be passed to the next as input.
|
|
# grep cmdlet filters the input with provided patterns.
|
|
# `$_` is the current object in the pipeline object.
|
|
ls | Where-Object { $_.Name -match 'c' } | Export-CSV export.txt
|
|
ls | ? { $_.Name -match 'c' } | ConvertTo-HTML | Out-File export.html
|
|
|
|
# If you get confused in the pipeline use `Get-Member` for an overview
|
|
# of the available methods and properties of the pipelined objects:
|
|
ls | Get-Member
|
|
Get-Date | gm
|
|
|
|
# ` is the line continuation character. Or end the line with a |
|
|
Get-Process | Sort-Object ID -Descending | Select-Object -First 10 Name,ID,VM `
|
|
| Stop-Process -WhatIf
|
|
|
|
Get-EventLog Application -After (Get-Date).AddHours(-2) | Format-List
|
|
|
|
# Use % as a shorthand for ForEach-Object
|
|
(a,b,c) | ForEach-Object `
|
|
-Begin { "Starting"; $counter = 0 } `
|
|
-Process { "Processing $_"; $counter++ } `
|
|
-End { "Finishing: $counter" }
|
|
|
|
# Get-Process as a table with three columns
|
|
# The third column is the value of the VM property in MB and 2 decimal places
|
|
# Computed columns can be written more succinctly as: `@{n='lbl';e={$_}`
|
|
ps | Format-Table ID,Name,@{name='VM(MB)';expression={'{0:n2}' -f ($_.VM / 1MB)}} -autoSize
|
|
|
|
|
|
```
|
|
|
|
|
|
Configuring your shell
|
|
```powershell
|
|
# $Profile is the full path for your `Microsoft.PowerShell_profile.ps1`
|
|
# All code there will be executed when the PS session starts
|
|
if (-not (Test-Path $Profile)) {
|
|
New-Item -Type file -Path $Profile -Force
|
|
notepad $Profile
|
|
}
|
|
# More info: `help about_profiles`
|
|
``` |