【Powershell】Start . でカレントディレクトリが開くのはなぜか

WindowsのコマンドとPowerShellで、`Start .` でカレントディレクトリがエクスプローラーで開かれるのはなぜ？と思い、調べた内容の記録。

# Windowsコマンド

## ドキュメント確認 - start
参照ページ：[Microsoftのドキュメント （Windowsのコマンド - start）](https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/start)
※Windows Serverのドキュメントだが、基本は同じと考えて参照

* 概要
> 指定したプログラムまたはコマンドを実行する別のコマンド プロンプト ウィンドウを起動します。

* 解説（抜粋）
> * コマンドとしてファイルの名前を入力することにより、ファイルの関連付けを通じて非実行可能ファイルを実行できます。
> * `start` を実行すると、指定した実行可能ファイルの検索が行われ、見つかった場合には、現在の作業ディレクトリに関係なく、その実行可能ファイルが起動します。 実行可能ファイルを検索して、どの拡張子にも一致するものがないと、`start` は名前がディレクトリ名と一致するかどうかを調べます。 一致する場合、そのパスにある `Explorer.exe` が `start` によって開かれます。


## つまり
`Start .` の動きはこうなる

1. `.` は実行可能ファイルか？　→　実行可能ファイルでない
1. `.` はディレクトリ名か？　→　ディレクトリ名（カレントディレクトリ）である
1. `Explorer.exe` でディレクトリ `.` （カレントディレクトリ）を開く 


# PowerShell
## コマンド確認
`start` はPowerShell従来のコマンドではないので、まずはAliasを確認

```
PS > get-alias start

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           start -> Start-Process


PS >
```

`Start-Process` の構文から、`Start .` は `Start-Process -FilePath .` ということになる。

```:Start-Process 構文
Start-Process
     [-FilePath] <string>
     [[-ArgumentList] <string[]>]
     [-Credential <pscredential>]
     [-WorkingDirectory <string>]
     [-LoadUserProfile]
     [-NoNewWindow]
     [-PassThru]
     [-RedirectStandardError <string>]
     [-RedirectStandardInput <string>]
     [-RedirectStandardOutput <string>]
     [-WindowStyle <ProcessWindowStyle>]
     [-Wait]
     [-UseNewEnvironment]
     [<CommonParameters>]
```


## ドキュメント確認 - Start-Process
参照ページ：[Microsoftのドキュメント （PowerShell - Start-Process）](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/start-process?view=powershell-5.1)

> このコマンドレットは `Start-Process` 、ローカル コンピューターで 1 つ以上のプロセスを開始します。 既定では、 `Start-Process` 現在のプロセスで定義されているすべての環境変数を継承する新しいプロセスを作成します。
> 
> プロセスで実行するプログラムを指定するには、実行可能ファイルまたはスクリプト ファイル、またはコンピューター上のプログラムを使用して開くことができるファイルを入力します。 実行可能でないファイルを指定する場合は、 `Start-Process` コマンドレットと同様に、ファイルに関連付けられているプログラムを `Invoke-Item` 開始します。
> 
> パラメーターを使用して、ユーザー プロファイルの `Start-Process` 読み込み、新しいウィンドウでのプロセスの開始、代替資格情報の使用などのオプションを指定できます。

[日本語版](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/start-process?view=powershell-5.1) がわかりづらかったので、[英語版](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-process?view=powershell-5.1) から

>The Start-Process cmdlet starts one or more processes on the local computer. By default, Start-Process creates a new process that inherits all the environment variables that are defined in the current process.
>
>To specify the program that runs in the process, enter an executable file or script file, or a file that can be opened using a program on the computer. If you specify a non-executable file, Start-Process starts the program that's associated with the file, similar to the Invoke-Item cmdlet.
>
>You can use the parameters of Start-Process to specify options, such as loading a user profile, starting the process in a new window, or using alternate credentials.

補記・意訳すると

`Start-Process` は、ローカルコンピューターで１つ以上のプロセスを開始します。 既定では、`Start-Process` で起動したプロセス（子プロセス）には、`Start-Process` を実行したプロセス（親プロセス）で定義されているすべての環境変数が継承されます。

プロセスとして起動するファイル（`-FilePath`）には、実行ファイル、スクリプトファイル、コンピュータ上のプログラムで開くことができるファイルを指定することができます。
実行ファイル以外が指定された場合は、コマンドレット `Invoke-Item` と同様に、指定ファイルに関連付けられたプログラムを開始します。

`Start-Process` のオプションパラメーターを使用することで、読み込むユーザープロファイル、新しいウィンドウでの開始、代替資格情報の使用などを指定できます。

## ドキュメント確認 - Invoke-Item
参考に `Invoke-Item` についても確認。

参照ページ：[Microsoftのドキュメント （PowerShell - Invoke-Item）](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/invoke-item?view=powershell-5.1)

* 概要

> 指定した項目に対して、既定のアクションを実行します。

* 説明

> コマンドレットは `Invoke-Item` 、指定された項目に対して既定のアクションを実行します。 たとえば、実行可能ファイルを実行したり、ドキュメント ファイル タイプに関連付けられているアプリケーションでドキュメント ファイルを開きます。 既定のアクションは項目の種類によって異なり、データへのアクセスを提供する PowerShell プロバイダーによって決まります。


## つまり
Powershellでの `start .` の動きはこうなる（一部推測）

1. `Start .` は `Start-Process -FilePath .`
1. ファイルパス `.` は実行可能ファイルか？　→　実行可能ファイルでない
1. ファイルパス `.` に関連づけられているアプリケーションは？
　→　【推測】ディレクトリ（フォルダ）には `Explorer.exe` が関連づけられている
1. `Explorer.exe` で `.` （カレントディレクトリ）を開く 

また、以下２つはどちらも、コマンド実行するとカレントディレクトリが開く。
* `start .`　( `Start-Process -FilePath .` )
* `ii .`　( `Invoke-Item -Path .` )