良くある疑問だと思いますが日本語での説明が見当たらないので、 Twitter で説明していましたが記事にしておきます。
そういえば PowerShell の拡張子の ps1 の 1 ってなんだろう。 psh ではだめだったのか。
— kos59125 (@kos59125) September 5, 2013
理由
あれ、元々 PowerShell v1 の時にバージョンごとに.....を意図されてました。 V2 で ps2 にするんじゃなくって、機能に違いはあっても拡張子分けるよりは 同じ拡張子で利用できるように....を意図して PowerShell V2 以降も ps1 になってます。
— guitarrapc_tech (@guitarrapc_tech) September 6, 2013
つまり ps1 の 1は バージョン (PowerShell V1) を意図してたけど PowerShell V2 以降でもういいやってなって ps1がのこったのね。 psは知ってのとおり他で利用されてて使えにゃかったのだ
— guitarrapc_tech (@guitarrapc_tech) September 6, 2013
参考
PowerShell MVPの方々が説明しています。 引用しましょう。
Why ".PS1" file extension for PS scripts? It does stand for 1. But when they started work on version 2, they decided that instead of having it install side-by-side with v1, they would try to make it "compatible" with 1. So instead of requiring you to have both PowerShells installed to run .ps1 and .ps2 scripts, they would make all ps v1 scripts work in ps v2... Of course, there's a TON of features in v2 that don't work in v1, but for some reason they abandoned the file extension as a way of differentiating it, and chose to use a comment: #requires -version 2.0 If you ask me, considering how many language features and cmdlets are not backwards compatible, it's a mistake -- they should use .ps2 and just allow it to run .ps1 *also* -- but they've decided to save the "breaking" of changing file extensions for a hypothetical future version which might be language incompatible. -- Joel
現状の .ps1 を使うことにした 大元の解説は PowerShell v2.0 発表時に説明されています。 こちらも引用しておきます。
PowerShell Scripts continue to use ".PS1". CTP: Versioning PowerShell Scripts continue to use ".PS1". We will continue to pursue this approach until there is a major change in the CLR or .NET frameworks which force us to go side-by-side. It is at that point that we'll go from .PS1 to .PS2 . Until then we will stay with .PS1 and everything that runs today will continue to run in new releases. You might write a .PS1 script which takes advantage of a cmdlet/feature that is only available in V2. If you send this to someone that has PS V1, it will fail "in some way and at some time". If it uses some new syntax, it will fail at parse time (with a PARSER error) but if it uses a new command line switch - it won't fail until it tries to run that command. This is what #REQUIRES is all about. You start your script with #REQUIRES -Version 2 And we will check version #'s and produce a precise error message If you have a #REQUIRES –VERSION 1 in your script, it will continue to run just find on PowerShell (V2) CTP because it is compatible with V1.
まぁ、PowerShell 4.0 でも まだまだ ps1 です。