Host here, thanks for sharing.
PowerShell faced extreme opposition at Microsoft, and its creator Jeffrey Snover was demoted for pursuing it.
Jeffrey was originally brought into Microsoft to help MS learn how to compete in the data center, but culturally they were so tied to the personal computer model of the world, that they fought him every step of the way.
Edit: Another interesting thing, is how Powershell exists because Windows isn't file based. Jeffrey's goal was server administration, but on Windows you can't just edit files to administer things, you need to call various APIs and get structured data back forth. The rich object model fell out of that. It was the only way.
( Also, apologies if the transcript has errors. I've gone from professional transcriptions to Descript and then a pass of GPT4 trying to find the right punctation breaks and then me doing a quick read through. I don't think its coming out as high quality as I'd like. )
And as far as I can tell its no longer a priority at MSFT, reading the complaints from the MVPs on Github about how MSFT promised a bunch of further investment that has not been realized, changes not implemented, good stuff just sort of left to rot on the vine.
I loved powershell with (some of) its weird warts, but I have moved on.
I’m curious about the scenarios that Powershell used to work for you in, and what tooling you’ve moved on to. Do you use something else for Write-Once-Run-(Nearly)Anywhere type scripts?
I primarily write Powershell Core scripts for scenarios where I need to execute the same commands on a variety of operating systems, and I know that the script is likely to be maintained by your “typical” sysadmin (highly technical, but not a programmer)in an environment where installing runtimes for programming languages is discouraged. I switched to macOS as my daily driver about 2 years ago, so PS fits these scenarios pretty well, and Powershell Core updated fairly regularly. Sure there are annoying bugs and misses with the built-in and add-on MS modules: networking cmdlets are an almost total miss, Get-LocalGroup (and maybe other commands?) is totally broken on some AzureAD-joined machines, and the Azure and MgGraph Powershell modules still don’t have enough coverage to move on from the legacy Windows Powershell modules (or even to rely on just one of them, for areas they supposedly cover). But overall I’ve been pretty happy that 99% of the time I can write a powershell script once, and it will run on any machine with Powershell Core, in a consistent way.
Don't do as much "local" sysadmin stuff as most of the workloads moved to the cloud and containers, and that's all automateable via APIs which are much nicer to work with in python with its useful library support. (one of the biggest misses in powershell)
There's still a lot of good stuff wrt powershell maintainability by normal humans (though the entire mental model of object output usually throws them for a loop for years) managing local stuff.
PowerShell has the whole Windows OS libraries, COM and .NET available, without additional installation, a bit more than just Python.
Absolutely, and the calling conventions for all those pieces of code make no sense to powershell folks :)
If you have a background in windows dev or any of those tools then yeah, easy mode go grab your tools, but for most people doing system automation the calling conventions and complete lack of discoverability within the powershell ecosystem (and their tools in no way helping out) made this not a realistic use case.
Shoot I have seen some powershell modules that have to embed string C#s and eval thing just to have basic performance or other basic use cases.
The same challenge with calling conventions happens with Python calling into Windows APIs, moreso since there aren't that many wrappers available, other than installing something like ActiveState Python.
Right, but it isn't really a core benefit of using PS is my point.
It actually is, as it provides scripting across the whole OS stack and applications, closer to Xerox, Lisp Machines and Smalltalk REPL, something that no UNIX has ever offered, with exception of outliers like NeXTSTEP and OS X.
This is all technically true, but the thesis is that PowerShell makes it all horribly clumsy to use.
From the perspective of the Lisp Machine or, hell, even the AS/400, PowerShell (and, while we're here, the CLR) doesn't quite go deeply enough, pervasively enough, across the system to make it truly useful in the same way.
Best I found is embedding LISP into .net
https://github.com/Lovesan/bike
Not quite. What I'm more alluding to is something like, say, rewriting smss.exe and csrss.exe to be CLR programs (along with the implication of porting the CLR to the Native API) and giving PowerShell access to their internals directly.
Extremely clumsy, yes. And not idiomatic - a vanishingly small people learning PS will be able to usefully discover, use, or troubleshoot this utilization.
At the very least they could have helped with the discovery/usage problem, but that would probably have been a really tall order for one little language to do.
IronPython also exists, although an older version of python.
For all practical purposes it is a dead project, sadly.
How is having the entire C# ecosystem a big miss?
It's a big miss for the casual convenience of a scripter/non-programmer. A Pythonic way to do a remote procedure call is XMLRPC (pseudocode):
The C# way is to use the Microsoft Windows Communication Foundation (WFC) Client Proxy using the Service Model Metadata Utility Tool and the Web Services Description Language (WSDL) and XML Schema Definition Language (XSD) files from the remote server, declare a public interface attributed as a Service Contract referencing a namespace, generate a class which inherits from the generic ClientBase<TChannel> and implements the new interface, create an instance of said WCF client and call its methods. (Or rely on Visual Studio magic to hide all that) - https://learn.microsoft.com/en-us/dotnet/framework/wcf/acces...In any decision, Python goes for "What would Guido do?" and C# gets some union of "what would a committee of Microsoft, IBM, Oracle do?", "What would impress Gartner?", "What is Microsoft legally obliged to do, and backwards-compatibly required to do?", "What would we do if we tried to do everything everyone needs all in one?", "What would Java do?", "What would a large team need to design and maintain a stable, typed, large system for years?".
PowerShell is on top of that; there's no simple included graphing and drawing, no simple hooks into Windows own voice recognition and OCR, and definitely not into whatever magically good ones newer Office / Cloud is using, no casual email or spreadsheet handling, no Visual Basic style form building, no simple data science; there's a few things you can do or download, generally less convenient than a Python equivalent. And Microsoft are leaving it all 'to the community' but the community is using Python so that's where the Excel power-user who wants to script a couple of things will go.
I don’t think Python, a general purpose scripting language; and PowerShell, a shell, are going for the same things. They have different goals and by your definition every other tool is a “big miss” because they are not Python.
I have never desired to do xmlrpc, ocr, voice recognition, or gui building from my shell (and if I did I still don’t see how importing a C# library would be a big miss). What I do desire to do is open files, read their contents and pipe them into other programs, something that Python makes a pain to do with all the file handling. Powershell definitely excels at this, does that make Python a big miss?
I thought I was replying somewhere under this other side-thread https://news.ycombinator.com/item?id=40875610 which says "There are probably users in the millions that are ok at the basics of programming, but don't have the job role to where tools like Java or C# make sense. Python is usually a good fit here, but I really wish Microsoft had something written for us common folks and not just server admins and IT folks. If Microsoft put some more effort into PWSH to where it wasn't turtle slow at things like parsing files and then started adding things like what I talk about above. Maybe even cmdlets for statistics and science...it could be something pretty amazing that your typical business analyst could quickly use"
in that context C# library isn't fit for it. Yes I agree Python and PowerShell aren't going for the same things; that's annoying because PowerShell is 80% of the way there.
I have wanted those things. Windows which has a built in speech recognition engine which is COM automatable, a shell (PowerShell) which can be a COM client, and I have a folder full of phonecall recordings. I have a folder full of photos with things like menus and road signs and I want the equivalent of strings.exe for OCR and PowerShell could almost do it. I've wanted to build a Delphi or VB6 or C# style drag-drop GUI and tried to do it in PowerShell with SharpDevelop, WinForms code, the ShowUI module. I've wanted to build a TUI but Windows console host isn't good at those. I've wanted to get jpg metadata out and done it with Shell.Application automation around Explorer instead of downloading mediainfo.
All these thing have something in common - a core in a low level language, glued together or scripted in a high level language. Microsoft have written the core. They have written the high level language. They just didn't bother to make it all integrated for the ordinary power user, or flesh it out with more features along those lines over the years.
Because, compared to a builtin "ConvertFrom-Speech" you have to be enough of a programmer to know you need C#, go looking for a package, navigate oneget/winget/psget/nuget/github to download it, worry about .NET version compatibility and module paths, work out how to add an assembly, and then deal with interop, [ref] parameters, byte arrays, streaming.
Same. And the contents could be all common formats on Windows since the 1990s - MP3, JPG, Excel - things Windows can read and play, things Explorer can read metadata from.
Yes, I think PowerShell is a far more convenient REPL than Python's REPL. Than any REPL I know of, actually - within the boundaries of introspecting small simple data, PowerShell and .NET at least. And yet Python has set()-set() and PowerShell has [system.collections.generic.hashset[psobject]]::new().ExceptWith() (it doesn't return anything it mutates in-place) and every week, people post on the internet asking how to do essentially set union, intersection, subtraction and equality checks in PowerShell and the answer has been unsatisfying for decades.
Adding packages is `dotnet add package {PackageName}`. That's it.
Worrying about version compatibility for new projects has stopped being an issue. The package either targets NS2.0 or whatever latest LTS currently is, in which case you just add its reference, or it doesn't in which case you use something else.
If it does, in 98% situations it just works. In the last 2% it has native dependencies which means either a) the package ships with binaries built for all popular platforms, b) the package adds a platform-specific dependent package automatically, or manually and mentions that in README (either with dotnet add package or system-wide library, apt-get install and friends), or c) the package comes with windows only native dll, which happens with ancient unmaintained packages, it's a rare case nowadays fortunately.
As someone whose primary PL is C#, I found https://github.com/waf/CSharpRepl and https://github.com/dotnet-script/dotnet-script far more accessible and useful. Compilation caching for the latter works relatively well to make startup latency tolerable for using it for writing scripts over Python. It's not the smoothest ride, but the advantages of C# make up for this.
Or I just do `dotnet new console -o MyScriptName --aot`, echo code into Program.cs and `dotnet publish -o .` it. Some do that with Rust as well. Especially useful if you need your script to go through a lot of data quickly and parallelize that well too.
Completely missing the point.
"It would be nice if Microsoft polished the stuff they already ship so non-programmers could use it more easily"
"Well I'm a professional programmer (and I have installed a bunch of SDKs and tooling already) and I find all this trivial".
The state of .NET Framework package management is pretty much irrelevant, nor can be changed.
(and it was not that different from the UX above anyway, way better than e.g. Python)
Nowadays, WCF and even CoreWCF are frowned upon. Popular choices are gRPC, SignalR and JSON-RPC.
IMO PowerShell is very well integrated with Microsoft Azure cloud. Every Azure resource I work with (Storage, VM, Kusto, EventHub, Service Fabric, AAD, Networking) has tons of PowerShell support. I never set time to use Python with Azure Cloud - and this is only because PowerShell is so good at Azure.
I use Python for AWS, a lot. Last I checked, to use the Azure Python module you have to setup an Enterprise app, which seemed like overkill to me, and not something I think most of our sys admins would want to do. Maybe I’m wrong?
But PS Core is a programming language, right? And only installed by default on Windows?
I'm assuming there's other constraints on your system that make it preferable to installing bash or python on your Windows boxes?
There have been regressions even. PowerShell 7 isn't backwards compatible with PowerShell 5 and some features that used to exist are just gone with no plan for a return, due to (surprise) fights between .NET and Windows teams over API metadata formats or something. Most incredibly Microsoft situation ever.
Say what you want about bash, at least it doesn't pull stunts like that.
Are there any currently-supported versions of Windows that don’t support Powershell Core? I recall installing it on Windows 2012, even.
I guess it depends on what you consider to be included in the terminal’s domain? There are entire papers and guides on which commands are considered safe (sometimes only when run in a very specific way), and which variants, alternatives, etc. you should use instead, for Bash scripts, because of the inconsistency in what a command evaluates, does, and returns for various distros. That’s not to hate on Bash, but just to point out that it’s not a strength of Bash vs PS.
When Powershell was first released I was primarily working with Unices and was very curious what would work better: The Unix way in cutting, changing and grepping some part of stdout (in some OS a bit simplified b with options for automated pricessing which commands the programm to output colon delimited or otherwise formatted)
Or the Powershell way where on can access data members directly.
I thought I would prefer the second method more, because the access looked much cleaner/structured.
But after all these years (still mostly Unix scripting but Powershell and some other environments too) my mind has changed.
Would like to hear what others would prefer' Unix method with some scripting language or windows method with Powershell)
And this is exactly the problem.
You no longer have en_US as a locale? Have some titles lounger.
You no longer have en locale at all? Have an greška instead of error.
Oh, you the schmuk who don't agrees to use the best units in the world, totally retarded and "bUt iF yoU WriTe THe dATe as in the journal..."[0] but freedom ones? No longer accept 13 as an hour. Like come on, every idiot knows there is no such thing as an 13th hour!
Oh, you added an additional column to help your busniessor whatever? Your sEd MagIK gone to hell.
Should I continue?
[0] when was the last time you actually wrote multiple documents so you can actually benefit from MMM-dd?
Combining both powershell and unix is neat!
I'm not aware of any difference in bash between vendor distributions for which this is true.
It's less of a problem in today's Linux monoculture, but I actually initially learned Perl and Tcl precisely because of subtle incompatibilities between systems for tools like sed and awk, not to mention utilities like ps and tar.
This may not count because it's not bash specifically or even Linux -> Linux, but one place you might run into this is running scripts between Linux and Mac/BSD.
In the past I've seen bad things happen because a script was written by someone on OSX that gets run on a Linux (GNU) based system.
Two common examples are the `sleep` and `sed` commands.
Edit: I meant to reply to the parent comment.
It's easy not to lose features when you don't have many to begin with... I mean, what are the features that disappeared? What's the bash equivalent of these features?
For a programming language, losing a feature is much, much worse than not having it in the first place.
I'd like to see examples to judge. What are the features? Also, are you confusing "the language" with "the standard library"?
Years old existing code suddenly breaking because of an infrastructure update is just way worse than limitations when writing new code.
For example: https://github.com/PowerShell/PowerShell/issues/13138
So the old org chart comic is correct:
https://flowingdata.com/2011/06/30/organizational-charts-in-...
Always was ︻┳═一
(hey, I managed to sneak a rifle past HN's Unicode filter :-D)
Wow, the Oracle chart is so spot on.
I was under the impression much of that is due to the fact that PowerShell is Windows-only, while PowerShell Core is multi-platform.
They now refer to the former as Windows PowerShell, and the latter as PowerShell. The Core part was dropped.
As someone deep into Microsoft ecosystem since MS-DOS 3.3, it feels like the old ways of WinDev vs DevDiv politics have slowly creeped back into daily Microsoft.
It is as if DevDiv is now full into UNIX like, poliglot, FOSS culture and such, now under Azure business unit, whereas WinDev is back into how to sneak people into Windows licensing and the usual old culture.
My guess from external observations is that the reward and bonus structure inside Microsoft is entirely decoupled from customer feedback and response. The middle managers are in charge of the product and they're fully insulated from any concerns outside of getting this years maximum bonus for themselves.
Monopolies always destroy innovation.
You can tell by WinGet which is a new product not even close to supporting anything PowerShell by design and almost being anti PowerShell with its overly verbose output. Which is odd since it's right up powershells alley being a management cli tool
If you have winget and powershell installed, try `Get-WingetPackage` and see what comes out. Or even better:
The "usual" winget cli tool is indeed not powershell compatible. But winget also ships with all the necessary cmdlets. You don't have to install anything extra.I was super excited to see this comment, but I don't seem to have those cmdlets, even though I'm on Windows 11, fully updated. Are you sure you didn't install something extra?
If I recall correctly, they only work in PowerShell 7. If you don’t even have them in there, you can install them from https://github.com/microsoft/winget-cli (which is bad UX, but if you just need them on one system it’s a way to do it).
I'm in PowerShell 7.4.2 and they're definitely absent. I hadn't thought to install directly from GitHub, given part of the whole shtick of winget is it's The One True Package Manager and bundled, but I can't say I'm surprised, either...
Probably better off installing from PowerShell Gallery instead. https://www.powershellgallery.com/packages/Microsoft.WinGet....
I don't remember. Maybe I did install the modules. https://www.powershellgallery.com/packages/Microsoft.WinGet....
The Winget module is a wreck. The way it is designed, unfortunately, neither fits the object oriented approach of PowerShell nor follows the PowerShell guidelines for cmdlets.
For instance https://github.com/microsoft/winget-cli/issues/3820 or https://github.com/microsoft/winget-cli/issues/3231.
Also, even though it does not completely work with PowerShell 5, it is marked as compatible. https://github.com/microsoft/winget-cli/issues/2881
The design choices made makes it weird. I hope it would be a good one in the future. But it is now problematic.
Does anyone even use winget? I tried but its repositories never have the tools I need in it. Scoop has been superior for me in every way.
I have found it useful. I used to install PowerShell 7.x, kubectl, Bicep (Azure language for deploying resources), etc. It works fine. The biggest problem I have is I cannot use it to install helm because the helm package is not shipped by the helm team (I don't trust packages shipped by third parties).
Yeah for the things they have its great, I've just found that they lack a lot of stuff. To this day they still don't have Apache Maven in the repository. I just use scoop, I've found that its repositories just have way more tools and it's way easier to contribute to.
Have you asked the Helm team why they don't ship their own package? It might be worth the effort.
I'm personally trying to use it inside configman running as SYSTEM and have gotten it working for the most part but I have not seen anything module based from Microsoft themselves.
Yes what I am doing can be done with intune but that's another story for another time. RIP Store for Business. I just want to deploy PowerBI and have it always be current and self updating.
UniGetUI (formerly WingetUI) is a really great tool since it supports multiple package managers.
https://github.com/marticliment/UniGetUI
There is a Winget client module for Powershell. I used it the other day to write a one liner that could upgrade all with exclusions. I didn't want to pin, because I still wanted to see updates I'm skipping.
My biggest gripe is that some Azure stuff seems to be available only through powershell, which is hard to install and configure (I think) in certain corporate policy-infested environments.
Actually Azure CLIs are kind of schizophrenic, in typical MS fashion.
You have Azure Powershel Cmdlets (the old 5.1 based, and the new Powershell Core based), AZ CLI (in Python), AZD CLI (in Go).
The only one that offers full power is actually the AZ CLI one, e.g. some Kubernetes features aren't exposed in the others.
Yeah - and a number of Azure/O365 Powershell modules have long been deprecated. The promise of 1:1 Graph API replacements has failed to materialize for years now.
Is this a case of programming languages > shell scripts, or REST APIs the LCD?
The Az PowerShell module just uses HTTP APIs, so anything they do can be done with other tooling if you really want to.
(There’s also the Az CLI tool, which I don’t like as much as the Az PowerShell module but might be easier to manage in an environment like that.)
Yes, true, they call APIs. But for whatever reason, MS decided that instead of documenting those APIs they went on the route of abstracting them in PS modules or the az-cli submodules that its mind boggling.
The REST API is documented. Maybe not completely so, but mostly.
https://learn.microsoft.com/en-us/rest/api/azure/
The Azure CLI [0] is a viable method of managing Azure infrastructure if you don't/cannot use PowerShell.
[0] https://learn.microsoft.com/en-us/cli/azure/what-is-azure-cl...
If it exists in Powershell, it is backed by a REST API. Lots of AZ SDK's include a helper method to make calling the API's easier (like az rest cli command or invoke-azrestmethod).
What have you moved on to? I don't think I could go back to bash after learning PowerShell and no longer parsing string output.
Pretty much all python, dicts work just as well over here.
What have you moved on to? I have to use Windows at work and PowerShell is way better than basic cmd, even better with Windows Terminal. I suppose you could probably install bash or another unix-y shell but that seems like it wouldn't be as integrated with Windows.
If anyone from MS-PWSH team reads this, I'd love for y'all to add some basic GUI functionality that doesn't involve me having to write a bunch of .NET. I'm sorry, but the reason I like PWSH in the first place is it's a simple dynamic language with lots of easy to use commands that I can chain together. I'd love to have a new set of cmdlets for creating simple user interfaces and charts.
For example, something like the below would be so simple for Microsoft to add to the product and remove a page of boilerplate code that I don't really understand well.
Create-Chart -Type "Bar" -XAxis $Cities -YAxis $GDP -OutputFile "C:/Documents/ProjectAnalysis/CitiesBarGraph.png"
There are probably users in the millions that are ok at the basics of programming, but don't have the job role to where tools like Java or C# make sense. Python is usually a good fit here, but I really wish Microsoft had something written for us common folks and not just server admins and IT folks.
If Microsoft put some more effort into PWSH to where it wasn't turtle slow at things like parsing files and then started adding things like what I talk about above. Maybe even cmdlets for statistics and science...it could be something pretty amazing that your typical business analyst could quickly use to build some really amazing software to do their job better or a prototype for the software team to actually implement in a more robust manner. It's such a really cool technology that has a lot of missing potential IMO.
It seems like Microsoft assumes that the three options are full software developer with C#, IT stuff with PWSH, or Excel for the business folks. Excel is really great in a lot of ways, but it is also pretty limited and VBA+Excel is one of the most limited ecosystems I've dealt with. I guess third party languages like Python, R, and so on make for another fourth option, but sometimes I wish Microsoft had spent more time in this area.
You are looking for something like Kusto then.
A query language? I don't think that's what I'm referring to at all if I found the right links. Business users can use SQL quite easily and tools like Powershell or Python make automating that easy.
Kusto renders graphs in your query results window
How is that relevant to my suggestion to have PWSH add in cmdlets for everything from GUI to chart/graphs, to adding scientific/numerical commands as well? I was talking about a general solution and not just graphs for my queries if that makes sense. I appreciate the suggestion though!
This immediately makes me think of TCL/Tk, back in the days where that was the lowest barrier to entry to get a basic X11 GUI app up.
TCL itself is very similar to PS in being a command based language, but it's a little weirder in some ways. It's nice and lightweight, but doesn't work with Windows as natively as PS, although I bet there are some COM or other libraries that can get you close.
The TK GUI is indeed lightweight, but a bit antiquated. I was thinking of something closer to Rebol, but maybe with a GUI builder as building a GUI with just Rebol syntax (although crazy powerful - Tetris is less than a page of code in Rebol) is a little challenging.
The main thing though is neither TCL or PS or Rebol covers everything I think is needed in a modern business analyst programming language. You need a simple dynamic language, ease of sharing programs, reasonable performance, really good OS interop, ease of building GUI, and a very large ecosystem of tools. Python is by far the closest here and is the programming language of choice for those in this segment for a good reason.
There are some third party tools like PowerShell Pro tools or PowerShell Ultimate (https://ironmansoftware.com/). I appreciate they cost, but if you are a builder of tools for others, they really can help massively!
Thanks for the link. Yeah , I was aware of this one and another GUI builder someone sells, but it just really seems like something MS should provide as built-in. The ability to share a script to any windows computer without them having to download anything (exception being an old copy of Windows) and just run a program is an important piece in my eyes.
I wonder why they chose to build something from scratch instead of using python or similar tools that existed before.
Because .net was the center of the whole ecosystem
Something like ksh, you mean? Like they talked about in the article?
I tried reading the transcript and couldn’t reach the end, it’s a bit hard to read in my opinion. I assumed it was machine generated while reading it, but I can’t say why specifically. Maybe it needs a bit of editing to be easier to read.
Thanks for the effort anyway, it’s still better than no transcript :)
Its funny, because professional transcriber will get the same words. But with better choosen paragraph breaks, and sentence splitting and dropping filler words where it hurts readability.
Hard to get right, it seems.
That was a great listen, thanks.
I wondered why there were so many unintelligible passages. I found it laborious to decipher. Thank you for explaining.
That makes me sad. The dude is absolutely brilliant.
Awesome post!
As someone who prefers to read interviews and articles rather than listen, I really appreciate you providing a transcript. Thank you!