Note: “$_” is used to refer to the “current object” which is passed to foreach in the loop. And $_.name is the “name” property of the current object in the loop.
Use a list of item PIPED to a bash command
– Echo $list_of_items | xargs -L1 bash -c ‘<some bash command’
Example: az group list
–query “[?starts_with(name,’az3000301’)]”.name –output tsv
| xargs -L1 bash -c “az group delete $0 –no-wait –yes”
Run a command-string using Invocation operator &
$c = “Get-process”
& $c // where $c could contain a STRING like “Get-Command” or “get-process”
## Where-Object:
Get-Service | Where-Object {$_.Status -eq “Stopped”}
Get-Service | where Status -eq “Stopped”
(‘hi’, ”, ‘there’) | Where-Object Length // items with length > 0 are output
Match Type: Get-Process | where StartTime -Is [DateTime] // StartTime is of .NET type [Date]
## OPERATORS @(….), (….), $(…)
$(..) is a SubExpression operator.. similar to how C# allows inline expressions (eg string interpolation “Hello $(name)”)
dir | foreach {“$_.GetType().FullName – $_.Name”} // doesnt evaluate unless we put the expression in $(…) like below
dir | foreach {“$($_.GetType().FullName) – $_.Name”} // interesting that $() is only needed for the first part of the expression, not the next
() is a Grouping operator.. Returns a scalar or enumerates the expression within..
We can get “inplace enumeration” with the Subexpression operator as below (note Grouping expression iterating over dir).
PS> “Folder list: $((dir c:\ -dir).Name -join ‘, ‘)”
Folder list: Program Files, Program Files (x86), Users, Windows
And @() is an Array subexpression operator – always returns an array..
$processArray = Get-Process | Select-Object -First 1
$processArray or $processArray.GetType().FullName // will show it as an Object of type System.Diagnostics.Process
whereas
$processArray = @(Get-Process | Select-Object -First 1)
$processArray // will show it as an Array of Objects → System.Object[]
## Array Set Operations (Union, Intersect, Subtract)
Code
$a = @(1, 2, 3)
$b = @(1, 2)
$c = @(2)
'Intersection $a ⋂ $b ⋂ $c'
$a | Where-Object {$_ -In $b} | Where-Object {$_ -In $c}
'Union $a ⋃ $b ⋃ $c'
$a + $b + $c | Select-Object -Unique
'Set difference $a - $b - $c (items in $a but not $b or $c)'
$a | Where-Object {$_ -NotIn $b} | Where-Object {$_ -NotIn $c}
Output
Intersection $a ⋂ $b ⋂ $c
2
Union $a ⋃ $b ⋃ $c
1
2
3
Set difference $a - $b - $c (items in $a but not $b or $c)
3
(thanks to Jason S on StackOverflow)