I'm sorry, PowerShell is a trainwreck of a language. Extremely unintuitive, inconsistent, cryptic.
Using a function? Call it as function($arg1, $arg2). Oh, did you write the function? Sorry, you'll have to call it as function $arg1 $arg2.
Want to pass a path to something? It's easy: -Path $path. Oh wait, $path is actually a real path and not a glob? You'll have to use -literalPath...if it's supported. Yep, we kept the same failed idea of CMD and decided argument expansion should be done by each command/function/program/cmdlet independently so that we can make damn sure nothing at all is ever consistent. There's a reason why every Unix shell, bash much included, handles argument expansion in the shell.
Sane variable scoping? Not from PS.
Want to use something from .Net? It's built in, a major selling point! Oh...sorry if the syntax is so incredibly buggered that it makes real world PowerShell/.Net code look like a bid for the Obfuscated Perl Contest. And once you get it "right", PowerShell can't grok anything beyond trivial. God help me, I had to craft and populate an IEnumerable of Tuple of String, String in PowerShell to pass to a .Net method (from DacServices). Finally crafted (looked like a spell incantation), it couldn't get through PowerShell to the method call in one piece. Flat out broken. Finally had to give up and just code a real C# console app to handle the 10 lines of code.
Want output/trace to display in the order you actually write it? When it actually happens? Better | Out-Default all of it or strange things happen.
Most sane languages, especially so-called "OOP" languages, actually stop when an exception is thrown by default. Typically with a default global catch that offers you a nice stack trace, or something. PowerShell? By default it keeps on trucking, not even a peep (bad old habits of CMD are hard to break I guess).
Misspell a variable somewhere? Or a method name? Not even a warning until runtime when it fails (but then keeps on trucking right along, happy to double down on the fail). Even Perl isn't that bad (at least with "use strict;").
PowerShell is better than CMD/Batch. But then, so is a swift kick to the head. It's a horrid language and a bad shell. Bash via Cygwin is a hell of a saner and more powerful way to use a shell on Windows. And if you ever need .Net something, do yourself a huge favor and do it from C# as a console app and call that...1,000,000,000 times better than trying to use the fugly hack of a .Net interface that PowerShell provides.