勉強する中で躓いた単語等について整理した

# はじめに
先日、「コマンドプロンプトとpowershellの違いを整理するように。」と宿題を頂きました。
そういえばPythonを勉強するなかで参考資料に指示されたとおり何も考えず使っていたが、コマンドプロンプトとpowershellについて「コマンド入力すると実行してくれるやつ」程度の認識しかありません。

諸先輩方は何を今更というような内容かもしれませんが、ゼロから独学でプログラミングを勉強する身としては、どんな簡単なものでも未知との遭遇なのです。

ということで、Qiitaに投稿してよいものなのかは悩みましたが勉強した内容を備忘録として残します。

# わかったようでよくわからないもの
コマンドプロンプトとpowershellの違いを調べるといいながら、まずそもそもこれらが何なのかすらわかりませんし、調べると調べただけ知らない単語が出てきます。とりあえず気になったものは片っ端から自分なりに整理します。
ただし、厳密な定義などを調べていくととてつもなく大変で途方もなさそうなので一般的に使われているニュアンスやイメージ程度のレベルで調べます。


## ツール、ソフトウェア、アプリ、プログラムの違い
色々な資料を見ていると「○○とは～をするツールです。」だったり「○○とは～をするアプリケーションです。」だったりと、同じ物を調べているのに表現が違うことが多々あり非常に混乱してきたので、これらの違いをまず理解したい。

### ツールとは
ツールはソフトウェア自体の事を指す場合と、ソフトウェアに搭載されている機能を指す場合があるらしい。ソフトウェアを指す場合では、機能として小規模なファイルの圧縮・解凍ソフトや時計、カレンダー等のソフトウェア（ユーティリティソフト）を指すことが多いようだ。
イメージ的にはソフトウェアという単語よりも、より限定的に機能について語る場合に使う単語と理解した。

>ツール 【tool】
>ソフトウェアの分野で、利用者が何かの作業をするときに助けとなる、特定の目的や機能のために用意されたソフトウェアや、ソフトウェアの機能のことをツールということがある。種類によっては「ユーティリティ（ソフトウェア）」（utility software）と呼ばれることもある。
>
>また、ソフトウェアの操作画面などで、基本的な機能、主要な機能などと区別して、補助的な機能や用途が限られる特殊な機能、後から利用者が追加した機能などのことを指してツールと呼ぶこともある。
>引用:https://e-words.jp/w/%E3%83%84%E3%83%BC%E3%83%AB.html

### ソフトウェアとは
ソフトウェアと聞くとExcelやgoogle chrome等を私はイメージしますが、ソフトウェアという単語の意味としてはコンピュータを動かすプログラムやファイル、フォルダなど物理的な実態を持たないものの集合体の総称らしい。（「ソフト」とも略される。）

ソフトウェアは大別するとwindows、Mac、Linux、androidなどのコンピュータそのものの制御や基本的な機能等を提供する「基本ソフト」と、個別に特定の機能、目的のために作られた「応用ソフト」のふたつに分けられ、最初に挙げたExcel等は応用ソフトに分類される。

>**ソフトウェア 【software】 SW / S/W**
>ソフトウェアとは、コンピュータを動作させる命令の集まりであるコンピュータプログラムを組み合わせ、何らかの機能や目的を果たすようまとめたもの。プログラムが動作するのに必要なデータも含まれる。
>コンピュータを構成する電子回路や装置などの物理的実体を「ハードウェア」（hardware）と呼ぶのに対し、それ自体は形を持たないプログラムや付随するデータなどをソフトウェアという。物理的には記憶装置（ストレージやメモリなど）の記録媒体における電気的あるいは磁気的、光学的な信号として存在する。
>ソフトウェアはその役割により、ハードウェアの制御や他のソフトウェアへの基盤的な機能の提供、利用者への基本的な操作手段の提供などを行なう「オペレーティングシステム」（OS：Operating System/基本ソフト）と、特定の個別的な機能や目的のために作られた「アプリケーションソフト」（application software/応用ソフト）に大別される。
>引用:https://e-words.jp/w/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2.html

### アプリケーションとは
先ほども少し出てきたが、アプリケーションとはソフトウェアの中でも個別の目的、用途に応じてコンピュータに追加されるソフトウェア（プログラム）を指すらしい。
Excel等を示す際には「ソフトウェア」と言うよりも「アプリケーション」と言うほうがしっくりくるのかもしれない。

>**アプリケーションソフト 【application software】 アプリ / 応用ソフト**
>アプリケーションソフトとは、ある特定の機能や目的のために開発・使用されるソフトウェア。「アプリケーション」（application）あるいは「アプリ」（app、apps）と略されたり「応用ソフト」と訳されることもある。
>用途や目的に応じて多種多様なアプリケーションソフトがあり、日常的に利用される代表的なものだけでも、ワープロソフトや表計算ソフト、画像閲覧・編集ソフト、動画・音楽再生ソフト（メディアプレーヤー）、ゲームソフト、Webブラウザ、電子メールソフト、カレンダー・スケジュール管理ソフト、電卓ソフト、カメラ撮影ソフト、地図閲覧ソフトなどがある。
>引用:https://e-words.jp/w/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%BD%E3%83%95%E3%83%88.html

### プログラムとは
プログラムはソフトウェアのうち、コンピュータにどのような処理を行うかを記述した命令書を示す言葉らしい。ただし、「ソフトウェア」＝「プログラム」として使うこともあるらしく、初心者としては非常に紛らわしい。

>**プログラム 【program】**
>プログラムとは、予定（表）、計画（表）、課程、式次第などの意味を持つ英単語。ITの分野では、コンピュータに行わせる処理を記述したコンピュータプログラムのことを略して単にプログラムということが多い。
>**コンピュータプログラム (computer program)**
>コンピュータが行うべき処理を順序立てて記述したもの。広義の「ソフトウェア」の一部であるが、実用上はプログラムとソフトウェアはほとんど同義のように扱われることが多い。
>プログラムを作成する作業や工程を「プログラミング」（programming）、これを行う人や職種のことを「プログラマ」（programmer）という。人間がプログラムを記述する際には、人間が理解しやすい人工言語である「プログラミング言語」（programming language）を使うことが多い。プログラミング言語で記述されたプログラムを「ソースコード」（source code）という。
>ソースコードはコンピュータが解釈・実行することができないため、コンパイラなどの変換ソフトによってコンピュータが解釈・実行できる機械語（マシン語）などで構成された「オブジェクトコード」（object code）に変換されてから実行される。スクリプト言語のように、この変換処理を開発時には行わず、実行時にインタプリタなどのソフトウェアによって動的に行う場合もある。
>引用:https://e-words.jp/w/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0.html

### まとめ
「ツール」、「ソフトウェア」、「アプリケーション」、「プログラム」について簡単に調べてみたが、参考にする資料によって若干内容が異なっていたり、実用上は本来の意味とは少し違う意味で使われることが多いことが分かった。
なので、結局のところ文脈からどの意味で使われているかを読み取らねばいけないようだ。

逆に言えば、「Excelというソフトウェア」と言おうが、「Excelというアプリケーション」、「Excelというプログラム」、「Excelというツール」だろうが一応意味は通じるっぽい。
ただ、Excelを「ツール」や「プログラム」といわれると個人的には違和感を感じる。

個人的な認識としては以下のように考えることにしました。

| 用語 | 個人的解釈 |
|:-|:-|
| **ソフトウェア** | コンピュータ上で何らかの目的や機能を実行するためのプログラムや設定ファイルなどの集まり  |
| **プログラム**  |  ソフトウェアを構成する一部でコンピュータに対する命令書 |
| **アプリケーション**   | 特定の機能や目的のため後からOSに組み込むソフトウェア  |
| **ツール**  | 時計を表示する等の単純な機能だけのアプリケーションおよび、複数の機能・目的を含むアプリケーションに搭載されている機能のこと  |

イメージとしては
 ```math
ソフトウェア\niプログラム
```
```math
ソフトウェア\supsetアプリケーション\supsetツール
```

## コマンドラインインターフェイス<br>キャラクターユーザーインターフェース
コマンドプロンプトが何かを調べていたらまずこの単語がよくでてきた。
どうやらこのふたつは単語は違うが意味は同じらしい。
CUI及びCLIはUI(ユーザーインターフェース）の類型のひとつで、UIには他にGUI（グラフィカルユーザーインターフェース）がある。詳しくは以下を参照。

#### ユーザーインターフェース
なんとも範囲が広く抽象的な言葉で使うには便利そうですが、学ぶには難しい言葉ですね。
利用者がパソコンを操作する事を考えた場合、情報を入出力するキーボード、マウス、ディスプレイ、スピーカー等のハードウェアもUIだし、ディスプレイに表示されるアイコンやウィンドウ、スピーカーから出てくる警告音や読み上げ音声もUI、パソコン自体やソフトウェアの使い勝手もUI、フリック入力や音声入力などの手段や方法ですらUIであるらしい。
もはやすべてがUIではないかと感じます。
アロハ並みに使用する場面の幅が広い。

>**ユーザーインターフェース 【user interface】 UI**
>ユーザーインターフェースとは、機器やソフトウェア、システムなどとその利用者の間で情報をやり取りする仕組み。システムから利用者への情報の提示・表示の仕方と、利用者がシステムを操作したり情報を入力したりする手段や方式、機器、使い勝手などの総体を表す。
>引用:https://e-words.jp/w/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9.html

#### コマンドラインインターフェースとキャラクターユーザーインターフェース

先にも述べましたが、この二つは同じもの。

UIのうち全てを文字でやり取りする方式をCUIまたはCLIと呼ぶらしい。
UIと同じように方式だけではなく、文字を入力するためのキーボードや、文字を表示するためのディスプレイやウィンドウもCLI。

>**CLI 【Command Line Interface】 コマンドラインインターフェース**
>CLIとは、コンピュータやソフトウェアが利用者に情報を提示したり操作を受け付けたりする方法（UI：ユーザーインターフェース）の類型の一つで、すべてのやり取りを文字によって行う方式。
>利用者はキーボードなどを用いて文字列によって指示を与え、コンピュータからはディスプレイ装置に文字を表示して応答を返したり情報を提示する。画面やウィンドウの上部から人間の入力文字列とコンピュータの出力文字列が交互に並ぶ対話式の操作環境が一般的である。
>引用:https://e-words.jp/w/CLI.html

>**CUI 【Character-based User Interface】 キャラクタユーザインターフェース**
>CUIとは、コンピュータやソフトウェアが利用者に情報を提示したり操作を受け付けたりする方法（UI：ユーザーインターフェース）の類型の一つで、すべてのやり取りを文字によって行う方式。
>引用:https://e-words.jp/w/CUI.html

#### グラフィカルユーザーインターフェース

GUIは文字だけのCLI(CUI)と違い、マウス等で位置情報を入力し、画面上のカーソルを動かしてアイコンやボタンを操作してコンピュータへの指示を行う方式。
一般的な利用者がしようするソフトウェアの大体がGUIで操作する。

>**GUI 【Graphical User Interface】 グラフィカルユーザーインターフェース**
>GUIとは、コンピュータの表示・操作体系（ユーザーインターフェース）の分類の一つで、情報の提示に画像や図形を多用し、基礎的な操作の大半をマウスやタッチスクリーンなどによる画面上の位置の指示により行うことができるもの。
>
>画面上にアイコンやメニュー、ボタンといった絵や図形に補助的な文字情報を組み合わせた操作要素が表示され、これをマウスやトラックパッド、タッチパネルなどのポインティングデバイス（位置入力装置）で選択してコンピュータへの指示を与える。
>
>パソコンなどではオペレーティングシステム（OS）が管理する「デスクトップ」（desktop）と呼ばれる初期画面が表示される。各アプリケーションソフトは「ウィンドウ」（window）と呼ばれる矩形の領域を与えられ、その中で表示や操作を行う。複数のウィンドウを同時に開き、並行して処理を行ったり、即座に切り替えて操作することができる。
>https://e-words.jp/w/GUI.html

## シェル、コンソール、ターミナルについて
今回記事を書くうえで、一番理解に時間がかかったのがこれらです。
結論としてはCUI関連の話をするうえではコンソールもターミナルもほぼ同義で扱われ、人間がシェルに命令を与える際に媒介となるインターフェースであると思うことにしました。
コマンドプロンプト起動した時のあの黒い画面です。

参考

https://www.mimir.yokohama/useful/0018-commandline.html

https://code-examples.net/ja/q/140a748

https://hackmd.io/@jyami/HJzohRn2D

https://www.hanselman.com/blog/whats-the-difference-between-a-console-a-terminal-and-a-shell

https://qiita.com/ieiringoo/items/d87cb8d401e3ffa4f22f

https://qiita.com/tadsan/items/441dcd910537d3f408e5

https://qiita.com/Ted-HM/items/9a60f6fcf74bbd79a904

### シェル
シェルとは人間がコンピュータに何かをしてもらう際に、OSや他のソフトウェアに対して命令して、それらからの出力を返してくれるソフトウェアとのことで、人間が理解できるプログラミング言語をOS等が理解できる機械語に変換して命令をしてくれる。
シェルは文字のみで操作を行うコマンドラインインターフェースベースのコマンドラインインタプリタの形態ととったコマンドラインシェルと、グラフィカルユーザーインターフェースベースのグラフィカルシェルに大きく分けられる。
コマンドラインシェルにはWindowsに標準で搭載されているコマンドプロント(cmd.exe)やpowershellがあり、グラフィカルシェルとしてはwindowsではエクスプローラーがあります。Python.exeもシェルです。

コマンドラインシェルについて、シェルに操作を命令するときに、例えばコマンドプロンプトでは黒い画面が表示され、黒い画面内のコマンドラインにコマンドを入力して、実行するとコマンドラインインタプリタが処理をして結果が表示されますが、コマンドを処理した機能と黒い画面に文字を表示してくれたりしている機能（外側）は別物です。
この実際に内部で処理を行ってくれたインタープリタ部をシェルと呼びますが、人間に見える形で表示してくれた機能も含めシェルと呼ぶ場合もあります。

>シェル 【shell】
>シェルとは、コンピュータのOS（オペレーティングシステム）を構成するソフトウェアの一つで、利用者からの操作の受け付けや、利用者への情報の提示などを担当するもの。転じて、OS以外のソフトウェアについても、その操作や表示を担当する機能やソフトウェア部品などのことをシェルと呼ぶことがある。
>シェルは入力装置などによる利用者の操作を受け付けて、対応する動作をOSカーネルや他のソフトウェアに指示したり、それらからの出力を画面に表示するなどして利用者に伝える。簡易なプログラムなどを記述して与えることで操作を自動化することができるようになっていることが多い。
>https://e-words.jp/w/%E3%82%B7%E3%82%A7%E3%83%AB.html

### ターミナル
ターミナルとはコンピュータに関する単語としては、コンピュータに接続して遠くで入力と出力を行うための装置の事を指すようです。
昔はコンピューターが非常に大きくて持ち運べないからターミナルを遠くから接続して、処理はコンピューターに行ってもらって結果の出力と入力だけ自分の席とかでやっていたらしいです。

また、この機械であるターミナルの働きをコンピュータ上で再現したようなGUIソフトをターミナルエミュレータ、端末エミュレータ、ターミナルソフトなどと呼ぶらしいのですが、それらを指して単にターミナルと呼ぶこともあるようです。

>**端末 【terminal】 ターミナル / term**
>端末とは、通信システムで回線やネットワークの末端に接続され、他の機器と通信を行う主体となる機器のこと。コンピュータシステムでは利用者が直接操作する機器を指す。
>自らは処理能力を持たず、通信回線やネットワークを通じてコンピュータ（本体）に接続し、操作やデータの入出力を行うための機器を端末という。
>
>キーボードなどの入力装置、ディスプレイなどの出力装置、通信装置などで構成され、外部のコンピュータなどと通信し、利用者の入力や操作を伝達したり、出力を受け取って利用者に提示（多くの場合は表示）したりする。
>参考：https://e-words.jp/w/%E7%AB%AF%E6%9C%AB.html

### ターミナルエミュレータ
上でもふれましたが、コンピュータに接続して入出力を行う機械であるターミナルをGUIソフトウェアとして再現したもので、コマンドプロンプトを起動した時にディスプレイに現れる黒い画面のウィンドウやpowershell起動した時の青い画面のウィンドウを表示してくれて、人間がキーボードから打った情報を受け取ってくれているソフトウェアのようです。

ただし、ターミナルエミュレータ単体では何もできないため、シェルとセットで配布されることが一般的らしく、先述のコマンドプロンプト（cmd.exe)とpowershellは起動時にconhost.exeというアプリケーションが一緒に起動しており、これがターミナルエミュレータであるとのこと。

>**ターミナルソフト 【terminal software】 ターミナルエミュレータ / terminal emulator**
>ターミナルソフトとは、ネットワークを通じて他のコンピュータに接続し、コマンドライン方式で遠隔操作するためのソフトウェア。メインフレームの端末（ターミナル）の機能をソフトウェアで再現したものから発展した名残りで「ターミナルエミュレータ」とも呼ばれる。
>コマンドライン（CLI/CUI）は利用者が端末のキーボードを操作して文字でオペレーティングシステム（OS）やアプリケーションへの指示を入力し、プログラム側からも画面に文字を表示して応答を返す方式で、多くのOSが基本的な操作方式として対応している。
>
>ターミナルソフトはこれを遠隔からネットワークを通じて利用できるにする入出力ソフトで、端末のターミナルソフトへ入力された文字が遠隔のコンピュータに転送されて実行され、出力された文字が端末へ返送されてターミナルソフトの画面に表示される。地理的に離れた場所にあるコンピュータを操作したり、キーボードやディスプレイが繋がれていないサーバを管理するために用いられることが多い。
>参考:https://e-words.jp/w/%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%82%BD%E3%83%95%E3%83%88.html

### コンソール
遠隔でコンピュータを操作するターミナルに対し、コンソールはコンピュータに直接接続されコンピュータの管理者がOSの特権的な機能でシステムの中枢を管理・制御できるものとしてくべるされることがあるらしい。

しかしながら、機能や役割が近いことからソフトウェアの話をする上では、コンソールとターミナルはほぼ同義で使われることがあり、ターミナルソフトの画面を示してコンソールウィンドウと呼んだり、ターミナルソフト自身をコンソールと呼ぶこともあるみたいでした。

>**コンソール 【console】 操作卓**
>コンソールとは、制御盤、操作卓などの意味を持つ英単語。大型機械や電子機器などの操作や監視のための装置を一か所に集めた盤状あるいは卓状の装置のこと。転じて、コンピュータの入出力装置や、文字の入出力による対話的な操作システム、OSの中核部分を制御できる操作画面などを表す。
>コンピュータの場合には、一台のコンピュータに直に繋がれた入出力装置のセットを指すことが多い。もとは大型コンピュータを制御するスイッチやつまみ、計器類などが配された制御盤や制御卓をパイプオルガンの演奏台（console）になぞらえてこのように呼ぶようになったが、後にディスプレイ（当初はCRT、現在は液晶）とキーボードの組み合わせが一般的になった。

### まとめ
シェルとターミナル（またはコンソール）は別物だが、表示と入力をターミナル（またはコンソール）が担い、背後での処理をシェルが行う関係からそれらのソフトウェアをまとめてシェルと呼んだりすることもある。
結局のところ、文章中でこれらの単語が何を指しているかは文脈から読み取る他ないのかもしれません。



# コマンドプロンプトとpowershellの違い

ようやく本題に入りますが、まずはそれぞれが何なのかから整理していきます。

## コマンドプロンプトとは
コマンドプロンプトといわれて思いつくものは？

1. Windowsに搭載されているシェル
2. CLIにおいて入力待ちを示す`>>>`のような記号の並び

私は上記の２パターンが思い浮かびましたが、今回話題にしたいのは1番の方です。紛らわしいので今後2番については私の記事内ではプロンプトと表現するように極力心がけます。

このコマンドプロンプトは上でもう言っていますがシェルです。シェルとは上で説明しているとおり人間からの指示をOSや他のソフトウェアに機械語で指示してくれるインタープリタです。
起動してターミナル(黒い画面）に`dir`や`where`や`cd`などのコマンドを入力してファイルの一覧を表示したり、ファイルの場所を探したり色々な事ができます。

コマンドの一覧は`help`コマンドで、各コマンドの説明は`help コマンド名`で表示できます。
ただし、いかんせんあの白黒の画面で表示されたところで見づらいのでMicrosoft公式のドキュメントや先人がまとめてくれている記事を参考にするのがよいと思います。

https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/windows-commands


コマンドプロンプトはコマンドラインインタプリタとして対話方式でコマンドを一つ一つ入力して結果を返してもらうこともできますが、コマンドを複数書いたファイルであるバッチファイル(.batや.cmd）を読み込んで書いてあるコマンドを上から順番に自動で実行してもらう方法もあり、バッチファイルでも簡単な条件分岐や繰り返しを支持することは可能らしい。

なお、バッチファイルは古くからWindows環境で使われた簡単なプログラムであるそうです。

## powershellとは
powershellもWindowsに今では標準で搭載されているシェルです。
コマンドプロンプトはWindows専用のアプリケーションですが、powershellは機能等が若干異なっているそうですがLinuxやMacOSでも動くそうです。

参考

https://docs.microsoft.com/ja-jp/powershell/scripting/whats-new/unix-support?view=powershell-7.2

https://qiita.com/tadnakam/items/f51e03021b95eb39f34b

https://macruby.info/powershell/how-powershell-differs-from-command-prompt.html

https://www.dospara.co.jp/5info/cts_str_pcuse_powershell

powershellはコマンドプロンプトが使いづらく機能不足が指摘され開発されたシェルということらしく、コマンドプロンプトで使用しいたコマンドをさらに拡張強化したコマンドレットと呼ばれるpowershellのコマンドをスクリプト言語として使用できるほか、コマンドプロンプトのコマンドも使用できる。
コマンドプロンプト同様に対話形式で実行できるほか、powershellでは一連のコマンドレットを記述したファイルであるシェルスクリプト(.ps1)を読み込んで一連の作業を順次実行することができる。

また、powershellではコマンドレットで取得した値をそのまま他のコマンドレットに渡すパイプ処理というものも使えるほか、コマンドプロンプトよりもコマンドの種類が多いのに加え処理の組み合わせも行えるためより複雑な動作が可能のようです。

さらに、利点や詳細は把握できていないませんが、[レジストリ](https://e-words.jp/w/%E3%83%AC%E3%82%B8%E3%82%B9%E3%83%88%E3%83%AA.html)や[WMI](https://e-words.jp/w/WMI.html)へのアクセスも標準でサポートされているということでした。

## まとめ
* コマンドプロンプトもpowershellもどちらもシェル
* powershellはコマンドプロンプトの上位互換でコマンドレットと呼ばれるコマンドがコマンドプロンプトより多い
* powershellではコマンドプロンプトのコマンドも使用できる
* powershellにはコマンドプロンプトで出来ないパイプ処理を行える
* powershellでは[レジストリ](https://e-words.jp/w/%E3%83%AC%E3%82%B8%E3%82%B9%E3%83%88%E3%83%AA.html)や[WMI](https://e-words.jp/w/WMI.html)へのアクセスが標準でサポートされている。


# コマンド、コマンドレットについて
コマンドプロンプトではコマンド、powershellではコマンドレットという命令文を用いてパソコンを操作することができる。
例えばコマンドプロンプトでは`cd`または`chdir`というコマンドでカレントディレクトリの変更ができるが、powershellのコマンドレットで同様の機能を持つのは`set-location`になる。
ということなのでコマンドプロンプトのコマンドとpowershellのコマンドレットは別物。（powershellで`cd`か`chdir`と入力して`set-location`の機能を実行できるが詳しくは後述。）
```terminal:例
#コマンドプロンプト
C:\>cd c:\Users #cdコマンドでカレントディレクトリを変更
c:\Users>

#powershell
PS C:\> set-Location C:\users #set-Locationコマンドレットでカレントディレクトリを変更
PS C:\users>
```
## 内部コマンドと外部コマンド
コマンドプロンプトのコマンドにはコマンドプロンプト(cmd.exe)のインタプリタの実行ファイル自身が処理をするものと、他の実行ファイルを呼び出して処理を行うものがある。
この前者を内部コマンド、後者を外部コマンドと呼ぶ。

例えば先ほどの`chdir`コマンドは内部コマンドであり実行と解釈はcmd.exeが行っている。

外部コマンドの一例として`where`コマンドがある、これはファイルを検索してそのファイルがある場所を返してくれるコマンドだが、このコマンドは`C:\Windows\System32\where.exe`が処理を行っている。
`C:\Windows\System32`というフォルダにはwindows OSを構成する実行ファイル等が入っている。

外部コマンドも内部コマンドもコマンドに引数やオプションをくっつけるだけで実行できるので、私は最初違いも何も考えずいましたが、上記のような違いがあります。
外部コマンドを何も考えずコマンドだけで実行できるのは以下の理由からです。
* コマンド名と同じ名前の実行ファイルがある
* 実行ファイルのあるフォルダにPATHが通っている
* 実行ファイルの拡張子を指定しなくても勝手に補完してくれる

cmd.exeで外部のソフトウェアを実行する際は本来なら実行ファイルのフルパスを指定する必要があります。PATHって便利ですね。

```:例
c:\>chdir \users #内部コマンドはもちろんコマンド 引数等で実行できる
c:\Users>

c:\Users>where cmd.exe　#外部コマンドもPATHが通っているので実行ファイル名のみで使用できる
C:\Windows\System32\cmd.exe

c:\Users>C:\Windows\System32\where.exe cmd.exe　#略さずに書くとこうなる
C:\Windows\System32\cmd.exe

c:\Users>where where　#外部コマンドは実行ファイルがcmd.exeと別にあるが
C:\Windows\System32\where.exe

c:\Users>where chdir　#内部コマンドはcmd.exeが実行しているので他に実行ファイルはない
情報: 与えられたパターンのファイルが見つかりませんでした。

```


:::note
powershellのコマンドレットは外部コマンドのように実行ファイル(.exe)等の実態を持たないため、内部コマンドに相当する。
:::

参考

https://blog.trainocate.co.jp/blog/c53

https://ascii.jp/elem/000/001/793/1793563/3/

## powershellでコマンドプロンプトの内部コマンドが使える
先ほどpowershellでカレントディレクトリを変更する際のコマンドレットは`set-location`と書きましたが、`cd`または`chdir`コマンドでもカレントディレクトリを変更することができます。

ですが、これはcmd.exeの機能としての`chdir`コマンドを実行してるわけではなく、powershellはコマンドプロンプトの後継というポジションで作られたため、コマンドプロンプトユーザーが元の感覚で使いやすいように`chdir`と書いても`set-location`の機能を呼び出したことにしてくれているようです。

これをエイリアスを割り当てるといい、`set-location`には`cd`、`chdir`、`sl`というエイリアスが割り当てられており、どのコマンドでも`set-location`というコマンドレットを呼び出したことになります。

この他にも同様に、powershellのコマンドレットにコマンドプロンプトの同様の機能のコマンド名がエイリアスとして割り当てられているため「powershellでコマンドプロンプトのコマンドが使える」みたいです。
エイリアスの一覧は`get-alias`というコマンドレットで確認できます。

https://docs.microsoft.com/ja-jp/powershell/scripting/learn/compatibility-aliases?view=powershell-7.2

```:set-locationのヘルプ
PS C:\users> get-help set-location

名前
    Set-Location

構文
    Set-Location [[-Path] <string>]  [<CommonParameters>]

    Set-Location  [<CommonParameters>]

    Set-Location  [<CommonParameters>]


エイリアス
    sl
    cd
    chdir

注釈
    Get-Help を実行しましたが、このコンピューターにこのコマンドレットのヘルプ ファイルは見つかりませんでした。ヘルプの一
    部だけが表示されています。
        -- このコマンドレットを含むモジュールのヘルプ ファイルをダウンロードしてインストールするには、Update-Help を使用
    してください。
        -- このコマンドレットのヘルプ トピックをオンラインで確認するには、「Get-Help Set-Location -Online」と入力するか、
           https://go.microsoft.com/fwlink/?LinkID=113397 を参照してください。
```

```:例
PS C:\users> set-location \
PS C:\> sl \users
PS C:\users> cd \
PS C:\> chdir \users
PS C:\users>
```
### 外部コマンドについて

なお、コマンドプロンプトの外部コマンドは先述した通り他の実行ファイルを起動しているのでpowershellでも実行ファイルのパスを指定して実行すれば使用できる。

ただし、実行ファイル名と同じエイリアスがすでにコマンドレットに割り当てられていたりする場合コマンドレットの方が優先的に実行されるので注意が必要。
例としてコマンドプロンプトでは`where`と入力すると`where.exe`にPATHが通っていてPAHTEXTに.exeが登録されているので`c:\Users>C:\Windows\System32\where.exe cmd.exe`と書いたのと同じくwhere.exeが呼び出されるが、powershellでは`Where-Object`というコマンドレットに`where`というエイリアスが割り当てられているため`where.exe`が呼び出されずに`Where-Object`のコマンドレットが実行される。

```:例
PS C:\> where cmd.exe #whre-objectが実行されている。(使い方が違うので値は何も帰って来てない）

PS C:\> where.exe cmd.exe　#PATHが通っているのでwhere.exeが実行されている。
C:\Windows\System32\cmd.exe

PS C:\> C:\Windows\System32\where.exe cmd.exe #フルパスで指定しているので問題なく実行される。
C:\Windows\System32\cmd.exe

```
# 環境変数について
ちょこちょこPATHやらPATHEXTという単語が出てきましたが、これらは環境変数といいます。
環境変数とはその名の通り変数で、コンピュータ名やユーザー名など環境によって異なる情報の入れ物です。変数名と内容はOSやユーザー単位で設定されています。
コンピュータのプログラムは環境変数を指定することで、いちいち環境によってコンピュータ名やディレクトリを変て指定する必要がなくなります。また、どのプログラムでも環境変数を指定すれば同じ変数の値を得ることができます。（特定のプログラムの中でだけ環境変数を変えて使用することもできる。）

>**環境変数 【environment variables】**
>環境変数とは、OSが設定値などを永続的に保存し、利用者や実行されるプログラムから設定・参照できるようにしたもの。プログラムの実行時などに必要となる、利用者やコンピュータごとに内容が異なる設定値などを記録するために用いられる。
>引用:https://e-words.jp/w/%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0.html

参考

https://qiita.com/jeyei/items/2c385e4e0488a5fa2591#%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%81%A8%E3%81%AF

## コマンドプロンプトで参照している環境変数
コマンドプロンプトで`set`コマンドを使用するとコマンドプロンプト上で参照している環境変数の一覧を表示できます。

```
C:\>set
ADVISOR_2022_DIR=C:\Program Files (x86)\Intel\oneAPI\advisor\2022.0.1
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\ユーザー名\AppData\Roaming
asl.log=Destination=file
CommonProgramFiles=C:\Program Files\Common Files
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
CommonProgramW6432=C:\Program Files\Common Files
COMPUTERNAME=BOUSAI-59
ComSpec=C:\windows\system32\cmd.exe
DriverData=C:\Windows\System32\Drivers\DriverData
EMC_AUTOPLAY=C:\Program Files (x86)\Common Files\Roxio Shared\OEM\
HOMEDRIVE=C:
HOMEPATH=\Users\ユーザー名
I_MPI_ONEAPI_ROOT=C:\Program Files (x86)\Intel\oneAPI\mpi\2021.5.2
IFORT_COMPILER21=C:\Program Files (x86)\Intel\oneAPI\compiler\2022.0.3\windows\
INSPECTOR_2022_DIR=C:\Program Files (x86)\Intel\oneAPI\inspector\2022.0.1
LOCALAPPDATA=C:\Users\ユーザー名\AppData\Local
LOGONSERVER=\\hoge
NUMBER_OF_PROCESSORS=8
ONEAPI_ROOT=C:\Program Files (x86)\Intel\oneAPI\
OneDrive=C:\Users\ユーザー名\OneDrive
OneDriveConsumer=C:\Users\ユーザー名\OneDrive
OS=Windows_NT
Path=C:\Program Files (x86)\Intel\oneAPI\mpi\latest\bin\;C:\Program Files (x86)\Intel\oneAPI\mpi\latest\bin\release\;C:\Program Files (x86)\Intel\oneAPI\mpi\latest\libfabric\bin\;C:\Program Files (x86)\Intel\oneAPI\mpi\latest\libfabric\bin\utils\;C:\Program Files (x86)\Intel\oneAPI\tbb\latest\redist\intel64\vc_mt\;C:\Program Files (x86)\Intel\oneAPI\tbb\latest\redist\ia32\vc_mt\;C:\Program Files (x86)\Intel\oneAPI\compiler\latest\windows\redist\intel64_win\compiler;C:\Program Files (x86)\Intel\oneAPI\compiler\latest\windows\redist\ia32_win\compiler;C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\;C:\windows\System32\OpenSSH\;C:\Program Files (x86)\Common Files\Roxio Shared\DLLShared\;C:\Program Files (x86)\Common Files\Roxio Shared\OEM\12.0\DLLShared\;C:\Program Files (x86)\Roxio 2010\OEM\AudioCore\;C:\Users\ユーザー名AppData\Local\Programs\Python\Python310\Scripts\;C:\Users\ユーザー名\AppData\Local\Programs\Python\Python310\;C:\Users\ユーザー名\AppData\Local\Microsoft\WindowsApps;C:\Users\ユーザー名\AppData\Local\Programs\Microsoft VS Code\bin;C:\Inkscape\bin;C:\windowssystem32;C:\Program Files\Pandoc;C:\texlive\2022\bin\win32
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 140 Stepping 1, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=8c01
ProgramData=C:\ProgramData
ProgramFiles=C:\Program Files
ProgramFiles(x86)=C:\Program Files (x86)
ProgramW6432=C:\Program Files
PROMPT=$P$G
PSModulePath=C:\Program Files\WindowsPowerShell\Modules;C:\windows\system32\WindowsPowerShell\v1.0\Modules
PUBLIC=C:\Users\Public
RCAUTOPLAY=C:\Program Files (x86)\Roxio 2010\OEM\Roxio Central 5\
SystemDrive=C:
SystemRoot=C:\windows
TEMP=C:\Users\hoge\AppData\Local\Temp
TMP=C:\Users\hoge\AppData\Local\Temp
USERDNSDOMAIN=KASENBOUSAI.LOCAL
USERDOMAIN=hogehoge
USERDOMAIN_ROAMINGPROFILE=hogehoge
USERNAME=hogehoge
USERPROFILE=C:\Users\ユーザー名
VS2022INSTALLDIR=C:\Program Files\Microsoft Visual Studio\2022\Community
VTUNE_PROFILER_2022_DIR=C:\Program Files (x86)\Intel\oneAPI\vtune\2022.2.0
windir=C:\windows
WSLENV=WT_SESSION::WT_PROFILE_ID
WT_PROFILE_ID={0caa0dad-35be-5f56-a8ff-afceeeaa6101}
WT_SESSION=338322ad-7c32-4146-bcb7-e765c241feb4
ZES_ENABLE_SYSMAN=1
```

`=`の左側が環境変数名で右側が変数の値です。
`%環境変数名%`というように記載すると環境変数名の値が帰ってきます。

```:例
C:\>echo %SystemRoot%\system32\where.exe 
C:\windows\system32\where.exe #%SystemRoot% = C:\windowsなので代入されてかえってくる。
```


代表的なものとしては以下のものがあります。
`set`コマンドは環境変数の編集を行うこともできますが、その操作で変更される環境変数はコマンドプロンプトで参照している環境変数のみでOSやユーザーで設定している環境変数は変更されません。

|環境変数|値|説明|
|:-|:-|:-|
|ComSpec|C:\windows\system32\cmd.exe|コマンドラインインタプリタの場所|
|TEMP<br>TMP|C:\Users\hoge\AppData\Local\Temp|一時的なデータのやり取りに利用するディレクトリのパス|
|PATH|C:\windows\system32<br>C:\Users\hoge\AppData\Local\Programs<br>\Python\Python310\Scripts\ <br>等々|プログラムを実行する際に実行ファイルを検索する対象フォルダ達。実行ファイル名を指定するとPATHに登録されているディレクトリを上から順番に検索して一致するファイル名を見つけたら実行する|
|PATHEXT|.COM、.EXE、.BAT、.CMD、.VBS、.VBE、<br>.JS、.JSE、.WSF、.WSH、.MSC|プログラムを実行する際に、指定する実行ファイル名の拡張子が省略されていた際に補完を試みる拡張子のリスト|