【簡単💫爆速】エクスプローラーから`vsc`でVSCodeを起動する

# 🔰 1. はじめに
Windows を使っている方へ質問です．

　**Q. ￤ エクスプローラー📂 を開かない日はありますか？**

おそらく殆どの人は，毎日のように **エクスプローラー** のお世話になっていることでしょう．

そして，<font color="#55C500">**アドレスバーに `cmd` と入れることで，いま開いている場所をカレントディレクトリとして コマンドプロンプト を起動できる**</font>[^cmd] ことも，知っている人は多いかもしれません．

ある日，私は思いました．「**似たようなことを <font color="#3EC9F2">VSCode</font> でもやりたい！**:laughing:」

# 🗒️ 2. この記事の内容

この記事では，「<font color="#3EC9F2">**エクスプローラーのアドレスバーに `vsc` と入力することで，いま開いている場所を VSCode で起動できるようにする方法**</font>」を説明します．

### 完成例

![vsc_small19.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668362/213d517f-8239-d03f-75a3-a41abc03a139.gif)

（背景が一瞬暗転するのは，裏でコマンドプロンプトが開くためです．すぐに消えます．）

# ✨ 3. 手順

ここから，具体的な手順を説明していきます．

:::note warn
**注意**
`C:\Windows\` に手を加えます．操作を誤ると**システムファイルに影響を及ぼす**かも知れません．<font color="#FF7575">**自己責任で進めてください**</font>．:bow:
:::

## ├ ① バッチファイルを書く

任意の場所に，以下の内容の `vsc.bat` ファイルを書きます．
ここでは，`C:\Tools\` の中に置くことにします．
```bat:vsc.bat
@echo off
code %cd%
```
- `@echo off` で，見やすさのためにコマンドの実行ログを非表示にしています
- `%cd%` で，カレントディレクトリを読み取り，それを `code` コマンドに渡しています

（コードの**更なる詳細**については，次章「[**4. どうして/どのように動いているのか**](#-4-どうしてどのように動いているのか)」をお読みください！）

## └ ② シンボリックリンクを作成する

<font color="#FF7575">**管理者権限で**</font> コマンドプロンプト を開いて，以下を打ち込んで Enter してください．
これは，`vsc.bat` が `C:\Tools\vsc.bat` にある場合の例です．
```:cmd
mklink C:\Windows\vsc.bat C:\Tools\vsc.bat
```

- `mklink` コマンドで，いま作ったバッチファイル `vsc.bat` のシンボリックリンクを `C:\Windows\` フォルダに作成します
- `C:\Windows\` は Windows の環境変数 PATH にデフォルトで含まれているため，`vsc` と打つだけで，どこからでも このバッチファイルを実行できます

:::note warn
**トラブルシューティング**
**`アクセスが拒否されました`** 等と表示される場合は，**管理者権限で実行できていない**可能性があります．コマンドプロンプトのアイコンを右クリックして「**管理者として実行**」をクリックして，コマンドプロンプトを開いてください．
:::

:::note info
### これにて完成です！
[**完成例**](#完成例) 同様の挙動を示すか確認してみてください．

以降では，上記手順の **詳細を解説**していきます．興味のある方は **ぜひ読んでみてください！**:muscle:
:::

:::note warn
**注意**
将来的に `vsc` という名前のプログラムが追加された際に，**競合するかもしれません**．その場合には今回のシンボリックリンクを**削除**するなど，対応してください．

```cmd:シンボリックリンクの削除
del C:\Windows\vsc.bat
```
:::

# 📚 4. どうして/どのように動いているのか

**たった2ステップで**，今回の内容を実装できました．この簡易性の裏には，どのような **抽象化** が隠れているのでしょうか．ここからは，それを深堀っていこうと思います！💎⛏️

## :green_book: そもそも バッチファイル とは何者か？

今回は，`vsc.bat` というバッチファイルを作り，それをコマンドプロンプトから呼び出しました．ここでは「バッチファイルとは何なのか」，そして「コマンドラインから呼び出せる実行ファイルとは何なのか」を見ていきます．

### バッチファイル（BAT/Batch file）とは
- **Windows 環境**（コマンドプロンプト等）で実行できるコマンドを記述したテキストファイル（ `.bat` あるいは `.cmd` ）です [^bat01][^bat02]
    - Mac（および Linux）での シェルスクリプト（ `.sh` ）に相当
    - 一見似ているが `.dat`（データファイル）とは別物 [^dat]
    - バッチ（Batch）：**ひと束**，一群，一団 [^batch]
- つまり，一度バッチファイルを作成しておけば，**ひとかたまり**のコマンドを楽に実行できるわけです✨
- バッチファイルの詳しい書き方については，[**バッチファイルの基本的な書式と考え方** - Qiita](https://qiita.com/go1101/items/a2df957120b709b94273) が参考になります
- さらに興味のある方は，Microsoft の公式ドキュメント [**Windows Commands** - Windows Server documentation](https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/windows-commands) に目を通してみるのも良いかも知れません

### コマンドラインから呼び出せる実行ファイルについて
- バッチファイルは Windows のコマンドが書かれたスクリプトで，ダブルクリックで実行できます
- ただし，**Windows の環境変数 `PATH` にパスが通っている** 場合，それに加え **コマンドラインからファイル名だけで直接実行できる** のです
    - 「**拡張子を省略して**」呼び出せる理由は，環境変数 `PATHEXT` に登録された拡張子が自動で探され，最初に見つかったものが実行されるようになっているためです
    - 環境変数 `PATHEXT` については，「そもそも“パスを通す”とはどういうことか」を含めて [**「PATH を通す」の意味をできるだけわかりやすく説明する試み** - Qiita](https://qiita.com/sta/items/63e1048025d1830d12fd) に詳しく載っています
- したがって，`PATH` が通っている `C:\Windows\` に `vsc.bat`（のシンボリックリンク）を置くことで，拡張子を省略したファイル名 `vsc` だけでコマンドを呼び出せるわけですね 

:::note info
**シンボリックリンク** については詳細を「[**:green_book: シンボリックリンク とは何か？**](#green_book-シンボリックリンク-とは何か)」で後述します
:::

### なぜ エクスプローラーのアドレスバーからコマンドが実行できるのか
- これは単純に，「エクスプローラーのアドレスバーがファイルパスだけでなく，**コマンドの実行にも対応している** ため」です
    - 正直，調べても「そういう仕様になっているから」以上の理由を見つけられませんでした…
- 調べたている中で見つけた，エクスプローラーのアドレスバーで使える便利技を幾つか載せておきます:v:
    - [**エクスプローラの今すぐ使えるアドレスバー芸** - Qiita](https://qiita.com/divideby_zero/items/17956579bd115d2613ac)
    - [**誰もが使っているエクスプロ―ラーをさらに使いこなすテク** - Ascii](https://ascii.jp/elem/000/000/851/851215/2/)

## :green_book: `code` コマンドとは？

`vsc.bat` では `code %cd%` といった具合に， `code` コマンドを使用しました．これは一体なんでしょうか？

### `code` コマンド

- VSCode のインストール時にデフォルトで環境変数 `PATH` に追加されるコマンドです
    - VSCode が丁寧にも CLI のコマンドをビルトインしてくれているわけですね
- よく使いそうなコマンドについては，[**VSCode使いなら抑えておくべきCodeコマンド** - Zenn](https://zenn.dev/ryuu/articles/what-vscodecommand) にまとまっています
- もっと興味が湧いてきた方は，公式ドキュメント [**Command Line Interface (CLI)** - Visual Studio Code](https://code.visualstudio.com/docs/editor/command-line) へどうぞ

## :green_book: シンボリックリンク とは何か？

今回，`C:\Tools\vsc.bat` の シンボリックリンク を `C:\Windows\vsc.bat` として作成しました．シンボリックリンクとは何なのでしょうか？「ショートカット」とは違うのでしょうか？

### シンボリックリンク（symlink）
- ある場所にあるファイルやフォルダへの **参照**（リンク）です
- 普通の「ショートカット」と違い，**OSレベルで** リンク先が実際にその場所に存在するかのように扱われます
    - ショートカットとの違いは，[**シンボリックリンクの使い方と落とし穴** - Qiita](https://qiita.com/go_astrayer/items/ab993cdc420d4f7f50d4) に一例が載っています
- また，シンボリックリンクの対義語として「**ハードリンク**」があります
    - **シンボリックリンク** は「シンボリック（象徴/記号）」と言うだけあって，リンク元のファイル/フォルダとは別物です（削除してもリンクが切れるだけで，リンク元は残ります）
    - **ハードリンク** は，リンク先と（殆ど）同じものであり，「リンク先」と「リンク元」という区別すら曖昧です（どのリンクを書き換えても他のリンクすべてに変更が反映されます） [^hardlink]
- もともと Linux などで出てくる用語らしいですが，ここでは Windows に特化した話をしています

### ショートカット・シンボリックリンク・ハードリンクの違い

それぞれの違いを表にまとめたものが，以下になります．[^difflink]

|  | ショートカット | シンボリックリンク | ハードリンク  |
| :---: | :---: | :---: | :---: |
| **目的** | GUI上の手軽なリンク | ファイルやディレクトリの参照 | 同じファイルへの複数の参照 |
| **実態の有無** | 実態なし | 実体なし | 実体あり |
| **データの共有** | オリジナルを開くだけ | オリジナルとリンク先は同じ内容 | ハードリンクすべてが同じ実体を共有 |
| **破損の可能性** | オリジナルを移動/削除すると無効化 | リンク先が削除されるとリンク切れ | どのリンクが消えてもデータは残る |
| **対象** | アプリ・ファイル・フォルダ | ファイル・ディレクトリ | ファイルのみ |
| **異なるディスクの参照** | 可能 | 可能 | 不可（同じパーティション内のみ） |
| **管理者権限** | 不要 | 必要 | 必要 |

## :green_book: なぜ わざわざ `C:\Tools\` にバッチファイルを置くのか？

シンボリックリンクが「OSも騙せる“本物に近い”ショートカット」であれば，初めから `C:\Windows\` にバッチファイルを置いてはダメなのでしょうか．

結論を言えば，それでも**問題なく動作します**．しかし，主に次のような理由から，`C:\Windows\` **以外** の場所にバッチファイルを置くことが望ましいのです．

### 直接 `C:\Windows\` にバッチファイルを置かない理由
- **保守・管理が やりやすい**
    - `C:\Windows\` には他にもシステムファイルが元からたくさん保管されています
    - 自作のバッチファイルを毎回 `C:\Windows\` から探すよりも，`C:\Tools\` にまとめてあった方が，管理が楽です
- **システムの安全性の観点**
    - いま述べたように `C:\Windows\` にはシステムシステムが保管され，その多くは OS にとって重要なものです
    - バッチファイルを `C:\Windows\` に直置きするよりも，実体を別フォルダに隔離させた方が，システムシステムの誤った上書き/削除などを防げます
- **OS アプデの影響回避**
    - Windows のアップデートや再インストールによって `C:\Windows\` に置いたバッチファイルが消えることがあります
    - 消えるのがバッチファイル本体ではなくシンボリックリンクであれば，再リンクさせれば良いだけなので，軽症で済みます

また，`C:\Windows\` にシンボリックリンクを作成せずに，`C:\Tools\` を環境変数 `PATH` に追加するのも，ひとつの手です．😎

# 🌇 5. おわりに

思っていたより長くなってしまいましたが，ここまで お読みいただき **ありがとうございます**．😌

今回の内容を踏まえれば，日常作業の利便性を上げる何かを，他にも実装できる気がしてきませんか？どうせ何かを学ぶなら，他に応用が利く形で（なるべくなら体系的に）習得したいですよね！🌟

自分はこの度，**初めて** Qiita に記事を書き，**初めて** ちゃんとバッチファイルに触れました．

エンジニアの世界では「**アウトプットするネタを見つけて記事にまとめることで，**（誰かの疑問に役立つだけでなく）**自分のインプットの質を高める**」ことが日常的に行われているように思います．これをすぐに習慣化するのは難しくとも，自分もこの好循環の渦（沼？）にゆったりと入っていきたいものです．🌱

[^cmd]: [**「コマンド プロンプト」を「エクスプローラー」から開く最速の技 ～えっ、ソコ？** - 窓の杜](https://forest.watch.impress.co.jp/docs/serial/yajiuma/1504991.html)
[^bat01]: [**バッチファイル(BATファイル)とは？作り方や書き方を初心者向けに解説！** - ITトレンド](https://it-trend.jp/development_tools/article/32-0040)
[^bat02]: [**拡張子「.bat」と「.cmd」の違い** - 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/diff190bat.html)
[^batch]: [**batchとは 意味・読み方・使い方** - weblio](https://ejje.weblio.jp/content/batch)
[^dat]: [**DATファイル** - 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word14156.html)
[^hardlink]: [**「シンボリックリンク」と「ハードリンク」の違い** - 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/diff640link.html)
[^difflink]: [**Windowsのシンボリックリンクとジャンクションとハードリンクの違い** - ITmedia](https://atmarkit.itmedia.co.jp/ait/articles/1306/07/news111.html)