Every once in a while, I have to write a script to automate a task. Maybe it's part of a CI/CD pipeline, or it's part of my dev workflow. My favorite language for writing scripts is PowerShell. Here is why:
1. Powershell has an object pipeline
When you pass data (or pipe them) from one command to the next, the data is treated as an object, not as a string. Which means the data can have different properties and it retains these properties.
This is very powerful and unlocks all kinds of composability scenarios. Commands don't have to be single purpose, they don't have to provide different switches to get different outputs. They give you everything and you can use only the properties you need.
2. You have the full power of .NET
Powershell is a first class programming language on .NET. You can do almost everything with Powershell. that you can do with C# or F#. You can even create GUIs if you want to. This means that you have access to the coherent and well designed Base Class Library of .NET as well as the entire gallery of nuget packages. It also has a lot of modules of it's own.
3. You can use Select/Where/GroupBy
Because Powershell is built on top of .NET, it has access to .NET's version of map/filter/reduce. They make scripts much more pleasant to write and read. However the names are a bit different from Javascript or other languages:
JS Name | Powershell |
---|---|
Filter | Where |
Map | Select |
Reduce | Measure / ForEach |
Reduce | GroupBy |
4. It's now cross-platform and open-source
Powershell Core is a cross-platform and open-source version of Powershell built on top of .NET Core maintained by Microsoft.
5. Working with Data is easy
You can easily work with Excel, XML and JSON data which makes working with APIs much easier.
Some cool examples
Here are some cool examples that demonstrate the points above:
Get top 3 largest files in a folder
Get-Childitem 'C:\Windows\System32' |
Where Length -gt (10MB) | # Only files that are greater than (-gt) 10 MB (MB is a constant in PS!)
Sort -Descending -Property Length | # Sort files by their length ascending
Select -First 3 Name, Length # Only select name and length properties (projection)
Output
Name Length
---- ------
MRT.exe 131005360
nvcompiler.dll 40444864
WindowsCodecsRaw.dll 32612880
Calling a REST API
In this example we call a JSON REST API and print a property
$uri = 'https://cat-fact.herokuapp.com/facts/random' # random cat fact API
$fact = Invoke-RestMethod -Uri $uri
Write-Host $fact.text
Output:
Cats make about 100 different sounds. Dogs make only about 10.
Export all process information as an excel sheet
Get-Process | Select-Object Company, Name, Handles | Export-Excel
Result:
Company | Name | Handles |
---|---|---|
Microsoft Corporation | Calculator | 537 |
Google LLC | chrome | 449 |
... | ... | ... |
Note: You'll have to install ImportExcel module for this example to work.
Importing data from excel
Consider this excel sheet:
City | Population |
---|---|
Erbil | 1500000 |
Sulaymani | 739182 |
Duhok | 1293000 |
Kirkuk | 1598000 |
Halabja | 245700 |
# Get the average poluation of cities in Kurdistan:
Import-Excel 'F:\cities.xlsx' | Measure -Average -Property population | Select -Property Average
Note: You'll have to install ImportExcel module for this example to work.
Note 2: Data is from Wikipedia.
Ouput:
1075176.4
While my preferred scripting language is Powershell, I strongly believe everyone should use whatever tools/languages they are productive in. There is no best language. Everyone has different preferences and that's okay.
If you're using Powershell on Windows, I suggest you read this post to make your experience even better.
Top comments (2)
Hy
Thanks for your post
I have Always found Powershell a little cryptic.
If i had to administrate Windows servers, I would use cssript.
Regards
That's okay. Everyone has their own favorite scripting language. But I encourage you to give Powershell a chance. It's a beautiful language once you learn it :)