エクスプローラのPCにフォルダを追加する

エクスプローラのPCに任意のディレクトリを追加する方法を書き留めておきます。

# 完成イメージ
PCにsourceフォルダを追加した例です。事前に3D オブジェクトは非表示にしてあります。
開くと「%UserProfile%\source」が参照されます。
![スクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237007/c8b47105-f671-d0a8-7146-ed3a2e71eb5b.png)

# はじめに
Windows 8.1を使っていた人間からするとエクスプローラを開くとPCが表示されるのが当たり前。
各ドライブに頻繁にアクセスするのでクイックアクセスよりPCが便利。

Visual Studioのプロジェクトが%UserProfile%\sourceに移動したときに不便になった。
C->Users->USER_NAME->sourceと毎回開くのがめんどくさい。
Visual Studioのエクスプローラでフォルダを開くから開くこともできますが今回は保留。

# やり方
レジストリにいくつか追加する。
以上

説明するのめんどくさいんでスクリプト書きました。

# スクリプトファイル配布
検証環境: Windows 10 20H2 x64

テキストエディタにコピペして使ってください。
**文字コードをANSI(Shift-JIS)**にしないと文字化けします。

やっていることはレジストリの4箇所にキーを追加してそれぞれに値を設定しています。
HKEY_CURRENT_USERに追加しているのでユーザ権限で実行可能です。
会社、学校のPCで(ry

スクリプトファイル冒頭にコメントしてますが、Windowsの初期設定だとスクリプトファイルが実行できません。
PowerShellで`Set-ExecutionPolicy Unrestricted -Scope CurrentUser`を打つとスクリプトファイルが実行可能になります。
今後スクリプトファイルを使う予定のない人は`Set-ExecutionPolicy Restricted -Scope CurrentUser`でもとに戻すのを忘れずに。

```powershell:AddDirectoryToThisPC.ps1
# Windows 10などでは、スクリプトファイルの実行がデフォルトで無効になっています。
# 下記のコマンドで実行可能にすることができます。
# スクリプトファイル実行後に元の状態に戻すことを強くおすすめします。

# スクリプトファイルの実行可能にする
# Set-ExecutionPolicy Unrestricted -Scope CurrentUser

# スクリプトファイルの実行不可能にする
# Set-ExecutionPolicy Restricted -Scope CurrentUser

# ----------------------------------------------------------------
# AddDirectoryToThisPC.ps1
# Created by Dolphin_0809
# このファイルを実行した際に発生したいかなる損害に対して責任を負いかねます。
# ----------------------------------------------------------------

# ----- 変数初期化 ここから -------------------------------------
# 参照先の指定
Write-Output "PCに追加するディレクトリの「パス」を入力してください。"
Write-Output "絶対パス 環境変数可 (e.g. %UserProfile%\source)"
[string]$TargetFolderPath = Read-Host
Write-Output ""

# 表示名の指定
Write-Output "PCに追加するディレクトリの「表示名」を入力してください。"
Write-Output "(e.g. source)"
[string]$name = Read-Host
Write-Output ""

# Infotipの指定
Write-Output "マウスオーバーで表示される「Infotip」を入力してください。"
Write-Output "(e.g. Visual Studio 2019 Projects)"
[string]$Infotip = Read-Host
Write-Output ""

# フォルダーアイコンの指定
# ここを変更することでフォルダーアイコンを指定できます。
$DefaultIcon = "%SystemRoot%\System32\imageres.dll,-235"

# GUID生成
# 基本的に変更不要です。
$guid = [Guid]::NewGuid().ToString()

# ----- 変数初期化 ここまで -------------------------------------
# ----- 確認 ここから -------------------------------------

Write-Output ("GUID: " + $guid)
Write-Output ("パス: " + $TargetFolderPath)
Write-Output ("表示名: " + $name)
Write-Output ("Infotip: " + $Infotip)
Write-Output ""

while ($true) {
  [string]$confirm = Read-Host "上記の通り追加します。よろしいですか？(y/N)"
  if ($confirm.ToLower() -eq "y") {
    break
  } elseif ($confirm -eq "" -or $confirm.ToLower() -eq "n") {
    exit
  }
}

# ----- 確認 ここまで -------------------------------------
# ----- レジストリ追加 ここから -------------------------------------

New-Item -Force -Path "HKCU:\SOFTWARE\Classes\CLSID\{$guid}"
New-ItemProperty -Path "HKCU:\SOFTWARE\Classes\CLSID\{$guid}" -Name "(default)" -PropertyType String -Value "$name"
New-ItemProperty -Path "HKCU:\SOFTWARE\Classes\CLSID\{$guid}" -Name "DescriptionId" -PropertyType DWord -Value 0x00000003
New-ItemProperty -Path "HKCU:\SOFTWARE\Classes\CLSID\{$guid}" -Name "Infotip" -PropertyType String -Value "$Infotip"
New-ItemProperty -Path "HKCU:\SOFTWARE\Classes\CLSID\{$guid}" -Name "System.IsPinnedToNamespaceTree" -PropertyType DWord -Value 0x00000001

New-Item -Path "HKCU:\SOFTWARE\Classes\CLSID\{$guid}\DefaultIcon"
New-ItemProperty -Path "HKCU:\SOFTWARE\Classes\CLSID\{$guid}\DefaultIcon" -Name "(default)" -PropertyType ExpandString -Value "$DefaultIcon"

New-Item -Path "HKCU:\SOFTWARE\Classes\CLSID\{$guid}\InprocServer32"
New-ItemProperty -Path "HKCU:\SOFTWARE\Classes\CLSID\{$guid}\InprocServer32" -Name "(default)" -PropertyType ExpandString -Value "%SystemRoot%\system32\shell32.dll"
New-ItemProperty -Path "HKCU:\SOFTWARE\Classes\CLSID\{$guid}\InprocServer32" -Name "ThreadingModel" -PropertyType String -Value "Both"

New-Item -Path "HKCU:\SOFTWARE\Classes\CLSID\{$guid}\Instance"
New-ItemProperty -Path "HKCU:\SOFTWARE\Classes\CLSID\{$guid}\Instance" -Name "CLSID" -PropertyType String -Value "{0E5AAE11-A475-4c5b-AB00-C66DE400274E}"

New-Item -Path "HKCU:\SOFTWARE\Classes\CLSID\{$guid}\Instance\InitPropertyBag"
New-ItemProperty -Path "HKCU:\SOFTWARE\Classes\CLSID\{$guid}\Instance\InitPropertyBag" -Name "Attributes" -PropertyType DWord -Value 0x00000011
New-ItemProperty -Path "HKCU:\SOFTWARE\Classes\CLSID\{$guid}\Instance\InitPropertyBag" -Name "TargetFolderPath" -PropertyType ExpandString -Value "$TargetFolderPath"

New-Item -Path "HKCU:\SOFTWARE\Classes\CLSID\{$guid}\ShellFolder"
New-ItemProperty -Path "HKCU:\SOFTWARE\Classes\CLSID\{$guid}\ShellFolder" -Name "Attributes" -PropertyType Dword -Value 0xF080004D
New-ItemProperty -Path "HKCU:\SOFTWARE\Classes\CLSID\{$guid}\ShellFolder" -Name "FolderValueFlags" -PropertyType Dword -Value 0x00000029
New-ItemProperty -Path "HKCU:\SOFTWARE\Classes\CLSID\{$guid}\ShellFolder" -Name "SortOrderIndex" -PropertyType Dword -Value 0x00000000

New-Item -Force -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\Namespace\{$guid}"

# ----------------------------------------------------------------

New-Item -Force -Path "HKCU:\SOFTWARE\Wow6432Node\Classes\CLSID"

New-Item -Path "HKCU:\SOFTWARE\Wow6432Node\Classes\CLSID\{$guid}"
New-ItemProperty -Path "HKCU:\SOFTWARE\Wow6432Node\Classes\CLSID\{$guid}" -Name "(default)" -PropertyType String -Value "$name"
New-ItemProperty -Path "HKCU:\SOFTWARE\Wow6432Node\Classes\CLSID\{$guid}" -Name "DescriptionId" -PropertyType DWord -Value 0x00000003
New-ItemProperty -Path "HKCU:\SOFTWARE\Wow6432Node\Classes\CLSID\{$guid}" -Name "Infotip" -PropertyType String -Value "$Infotip"
New-ItemProperty -Path "HKCU:\SOFTWARE\Wow6432Node\Classes\CLSID\{$guid}" -Name "System.IsPinnedToNamespaceTree" -PropertyType DWord -Value 0x00000001

New-Item -Path "HKCU:\SOFTWARE\Wow6432Node\Classes\CLSID\{$guid}\DefaultIcon"
New-ItemProperty -Path "HKCU:\SOFTWARE\Wow6432Node\Classes\CLSID\{$guid}\DefaultIcon" -Name "(default)" -PropertyType ExpandString -Value "$DefaultIcon"

New-Item -Path "HKCU:\SOFTWARE\Wow6432Node\Classes\CLSID\{$guid}\InprocServer32"
New-ItemProperty -Path "HKCU:\SOFTWARE\Wow6432Node\Classes\CLSID\{$guid}\InprocServer32" -Name "(default)" -PropertyType ExpandString -Value "%SystemRoot%\system32\shell32.dll"
New-ItemProperty -Path "HKCU:\SOFTWARE\Wow6432Node\Classes\CLSID\{$guid}\InprocServer32" -Name "ThreadingModel" -PropertyType String -Value "Both"

New-Item -Path "HKCU:\SOFTWARE\Wow6432Node\Classes\CLSID\{$guid}\Instance"
New-ItemProperty -Path "HKCU:\SOFTWARE\Wow6432Node\Classes\CLSID\{$guid}\Instance" -Name "CLSID" -PropertyType String -Value "{0E5AAE11-A475-4c5b-AB00-C66DE400274E}"

New-Item -Path "HKCU:\SOFTWARE\Wow6432Node\Classes\CLSID\{$guid}\Instance\InitPropertyBag"
New-ItemProperty -Path "HKCU:\SOFTWARE\Wow6432Node\Classes\CLSID\{$guid}\Instance\InitPropertyBag" -Name "Attributes" -PropertyType DWord -Value 0x00000011
New-ItemProperty -Path "HKCU:\SOFTWARE\Wow6432Node\Classes\CLSID\{$guid}\Instance\InitPropertyBag" -Name "TargetFolderPath" -PropertyType ExpandString -Value "$TargetFolderPath"

New-Item -Path "HKCU:\SOFTWARE\Wow6432Node\Classes\CLSID\{$guid}\ShellFolder"
New-ItemProperty -Path "HKCU:\SOFTWARE\Wow6432Node\Classes\CLSID\{$guid}\ShellFolder" -Name "Attributes" -PropertyType Dword -Value 0xF080004D
New-ItemProperty -Path "HKCU:\SOFTWARE\Wow6432Node\Classes\CLSID\{$guid}\ShellFolder" -Name "FolderValueFlags" -PropertyType Dword -Value 0x00000029
New-ItemProperty -Path "HKCU:\SOFTWARE\Wow6432Node\Classes\CLSID\{$guid}\ShellFolder" -Name "SortOrderIndex" -PropertyType Dword -Value 0x00000000

New-Item -Force -Path "HKCU:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\Namespace\{$guid}"

# ----- レジストリ追加 ここまで -------------------------------------
# ----- 通知 ここから -------------------------------------

Write-Output "すべての処理が終了しました。"
Write-Output "GUIDはPCから表示を消す際に必要になります。"
Write-Output "必ず控えるようにしてください。"
Write-Output ("GUID: " + $guid)
Read-Host "Enterキーで終了します。"

# ----- 通知 ここまで -------------------------------------
```
### 追記 2020-12-17
レジストリにキーを追加する際に親のキーが存在せず正常に終了しない不具合を修正
スクリプトファイルの4ヶ所に`-Force`を追記

# 戻し方
追加だけだと無責任すぎるので戻し方も書き留めます。

レジストリエディッタを開いて以下のキーを削除します。
GUID忘れたひとはInfotipに設定した値とかで検索かけて、GUID探してください。
`HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{GUID}`
`HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\Namespace\{GUID}`
`HKEY_CURRENT_USER\SOFTWARE\Wow6432Node\Classes\CLSID\{GUID}`
`HKEY_CURRENT_USER\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\Namespace\{GUID}`

# 参考サイト
[WindowsエクスプローラのサイドバーにGoogleドライブを追加する方法](https://www.it-swarm.dev/ja/windows/windows%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A9%E3%81%AE%E3%82%B5%E3%82%A4%E3%83%89%E3%83%90%E3%83%BC%E3%81%ABgoogle%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/959040652/) 2020-06-28 閲覧