I've never used it much and assumed it was an MS attempt to gain something like what the other shells already had.
I generally prefer bash for job control and pipe parallelism. For more complex tasks that would require a hash, internet access complex parsing etc., I tend to write a script in a different language, and plug it into a pipeline with bash.
The lack of parallelism in PS is the second biggest reason I don't use it.
The single biggest reason is bash is my common interface across Linux, Windows (cygwin), OS X and Solaris (when I used to run it).
I've done parallelism in PS, it's not difficult[1][2]. IIRC there were some gotchas, but it's certainly possible.
> For more complex tasks that would require a hash, internet access complex parsing etc., I tend to write a script in a different language, and plug it into a pipeline with bash
Right, you have no other choice in bash. Powershell lets you do all that within the language itself trivially.
1. https://technet.microsoft.com/en-us/library/hh849693.aspx 2. https://technet.microsoft.com/en-us/library/hh849718.aspx
You can instantiate .net objects, query their state, manipulate them interactively, and pass them around. You can also trivially write new shell commands in C#.
If you go through the tutorials and write a cmdlet in C#, and see how it interacts with powershell, you'll understand why it's cool. Might not be useful for everything, but it's well designed and extremely powerful.
This is the spirit of unix taken to the next generation. It's an incredibly useful CLI environment and pipeline which makes it easy to combine small tools to achieve powerful functionality while also facilitating making scripts by making them easier to use and easier to write.
For example, let's say I wanted to find every process using more than 100m of ram. With powershell that's just:
get-process | where WorkingSet -gt 100e6
Because powershell is object based you gain a lot more potency in the command pipeline. For example, let's say I wanted to kill all processes that matched a certain filter. That's as easy as piping the output of get-process through some filters then into stop-process. Let's say instead I wanted to wait until all instances of firefox are closed, that's just this: get-process | where path -like '*\firefox.exe' | %{ $_.WaitForExit() }
Powershell is far from perfect and it has a few very annoying gotchas here and there, but so does bash, python, and any other language for that matter. Powershell is a very powerful language that has benefited from a lot of rethinking of some of the traditions in command line interfaces that exist solely because that's how it used to work back in the day despite the reasons for those choices no longer pertaining in the here and now (teletype terminals, slow connections, slow everything, etc.). gps | where WorkingSet -gt 100MB
as well, which probably reads closer to your intent.