【Windows】コマンドプロンプトとPowerShellの違い

# 概要
OSに命令を出して操作するために使用する、Windowsのコマンドラインツールの「コマンドプロンプト」と「PowerShell」について、違いをまとめました。


# 目次
- [歴史](#歴史)
- [使い分け](#使い分け)
- [入力するコマンドについて](#入力するコマンドについて)
- [使用方法](#使用方法)
- [普通に起動した場合と管理者として実行した場合の違い](#普通に起動した場合と管理者として実行した場合の違い)
- [ターミナルとは](#ターミナルとは)

# 歴史
### コマンドプロンプト
「コマンドプロンプト」という名称自体は2000年2月に発売されたOSであるWindows2000から使用されました。Windows2000以前のWindows95やWindows98では「DOSプロンプト」「MS-DOSプロンプト」という名称で、[MS-DOS](https://ja.wikipedia.org/wiki/MS-DOS)を操作するためのツールという形になっていました。
Windows9x系のOSはMS-DOSを拡張して作成されており、そのベースになっているMS-DOSを操作できるCUIとして「DOSプロンプト」が存在していました。
WindowsNT以降のOSはMS-DOSをベースにはしておらず、新しく作成されているので、「DOSプロンプト」は無くなったという流れになります。
Windows9x系は「DOSプロンプト」、WindowsNT系は「コマンドプロンプト」のようなイメージです。
Windows9x系のDOSプロンプトの操作性は基本的にMS-DOSと似ていて、従来のDOSユーザーも容易に使うことができました。

:::note
1981年に販売されたMS-DOSはシングルタスク方式で、一度にひとつのタスクしか実行できませんでした。例えばファイルのコピー中などプログラムが実行している間はコマンドが入力できません。なのでバッチ処理も一つずつ実行する順次処理になっていました。
:::

### PowerShell
2000年代初頭、当時のWindowsのコマンドプロンプトはLinuxやUnixと比べると機能的に劣っているという批判がありました。実際にコマンドプロンプトは記載できる命令文が比較的単純なものしか書けませんでした。
この問題を解決するため、Microsoftは2002年に「Monad」というプロジェクトを立ち上げ、強力なスクリプト言語やシェル環境を提供できるように進めていきました。
その後、2006年11月にPowerShellがリリースされました。PowerShellは従来のコマンドプロンプトやバッチファイルにとって代わるツールという位置付けです。
2016年にはオープンソース化されており、MacOSやLinux等の他のOSでも利用できる「PowerShell Core」もリリースされました。

:::note
Shellは「殻」という意味です。OSを包むインターフェースのイメージだと思います。
なのでPowerShellという名前はOSと対話できる強力なインターフェースという意味合いになります。
コンピュータ業界では「Shell」という言葉は以下の意味合いでよく使用されます。

>シェル (英語: shell) とは、コンピュータプログラムの一種で、ユーザーへのインタフェースを提供するものを指す。オペレーティングシステム（OS）を持つ高機能なコンピュータにおいて、その機能への容易なアクセスを提供する。

**参考：[シェル (Wiki)](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%82%A7%E3%83%AB)**
:::

# 使い分け
PowerShellはコマンドプロンプトと異なり、出力結果がテキストではなくてオブジェクトとして扱われます。そのため単純なコマンドではシンプルなコマンドプロンプトの方が速く感じる場合があります。ただし複雑な操作を行う場合はコマンドプロンプトはコマンド操作が複雑になるので、PowerShellで行った方が効率的です。

# 入力するコマンドについて
PowerShellはコマンドプロンプトの課題点を考慮して新しく作成されたため、PowerShellはコマンドプロンプトとは異なるシェルを使用しています。ただし、PowerShellではコマンドプロンプトのコマンドも全てでは無いですが使用できるようになっています。

参考：
- [PowerShell で CMD コマンドを実行する](https://www.delftstack.com/ja/howto/powershell/run-cmd-commands-in-powershell/)
- [PowerShellでコマンドプロンプトのコマンドを実行したい](https://note.com/mahalo_/n/nd02502b812e3)

参考として、以下のようにコマンドプロンプトのコマンドとPowerShellのコマンドの違いがあります。

|やりたいこと|コマンドプロンプト|PowerShell|
|:-:|:-:|:-:|
|ディレクトリ作成|mkdir フォルダ名|New-Item -ItemType Directory フォルダ名|
|ディレクトリ移動|cd フォルダ名|Set-Location フォルダ名|
|テキストファイルを作成|echo テキスト文 > test.txt|"テキスト文" \| Out-File test.txt|
|テキストファイルを削除|del test.txt|Remove-Item test.txt|
|ノートパッドを起動|start notepad.exe|Start-Process notepad.exe|
|起動中のプロセス一覧を表示|tasklist|Get-Process|

:::note
PowerShellのコマンドはエイリアスを使用するともう少し短くできます。
例えば`New-Item`のエイリアスは`ni`なので、`New-Item`の部分を`ni`と記載することもできます。
また、PowerShellで`Get-Alias`と入力すると、エイリアスの一覧が表示されます。
参考：[エイリアスとは(PowerShell 入門)](https://blog.powershell-from.jp/?p=292)
:::

#### 参考
- [コマンドプロンプトと PowerShell の比較表](https://baldcat18.github.io/powershell/cmp_cmd/index.html)
- [Linuxコマンド・コマンドプロンプト(DOS)・PowerShellコマンド比較・対応表](https://linux.just4fun.biz/?%E9%80%86%E5%BC%95%E3%81%8DUNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/Linux%2C%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%2CPowerShell%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E6%AF%94%E8%BC%83%E8%A1%A8)

# 使用方法
既にネット上に多くの情報があるため、以下に参考になりそうなサイト様や動画様を記載しました。

### コマンドプロンプト
- [Windows コマンドプロンプトのコマンド一覧](https://itsakura.com/windows-command)
- [動画：コマンドプロンプトとバッチファイル入門｜パソコン自動化初歩](https://www.youtube.com/watch?v=gKgAgtxyj8w&t=54s)

### PowerShell
- [PowerShellのコマンド一覧とコマンドレットの詳細確認方法](https://devoevo.com/powershell-command/)
- [動画：PowerShell入門](https://www.youtube.com/watch?v=rRMDVBdZj0U&list=PLk_jtuUlslSR6V1s2WSG8dLhnLSoe_B9i&index=1)

# 普通に起動した場合と管理者として実行した場合の違い
コマンドプロンプトもPowerShellも「管理者として実行」することができます。管理者として実行していないと、実行が許可されないコマンドがあります。
例えばディスクやファイルシステム、ネットワークやセキュリティ関連のコマンドは、管理者として起動していないと実行できないコマンドがあります。
「管理者として実行」している場合は、コマンドプロンプトやPowerShellのウィンドウのタイトルに「管理者」という文字が表示されます。

:::note
「管理者として実行」した場合のみ使用可能なコマンドは、システムの重要な部分を変更できるものもあります。なのでコマンドの詳細な挙動の把握や入力ミスの確認など、実行する前に十分な注意が必要です。
:::

# ターミナルとは
似ている？言葉にターミナルというものがあります。ターミナルは日本語に訳すと「端末」という意味になります。昔はコンピュータ (メインフレーム) ひとつに、複数のターミナル (端末) が接続されていました。その端末は基本的にキーボードと画面だけの構成で、OSは入っていませんでした。
現代ではPCが主流になり、一つのコンピュータに画面とキーボードもくっついていますが、それでもOSに指示を出す入力装置の意味合いとして、コマンドプロンプトやPowerShellをターミナルと呼んだりします。

Windowsで使用できるターミナルはコマンドプロンプトやPowerShell以外にも[cmder](https://cmder.net/)や[ConsoleZ](https://github.com/cbucher/console)などがあります。

:::note
厳密にはターミナルは画面やGUIの部分のみを指し、実際に画面に表示されるコマンドなどの文字はシェル部分の機能になります。なので色々なサイトで配布されているターミナルは基本的にシェルと一緒に配布されていることが多いです。
:::
#### 参考
- [ターミナル・コマンドプロンプトとは何か](https://meriek.com/programing/programmingnyumon/terminal/)

# 終わりに
ターミナルを使って素早く操作する姿は、まるで映画のワンシーンのようで格好いいですが、なかなかコマンドが覚えられずいつも調べながら操作しています（笑）