ペアになるフォルダを開く
好きなファイル or フォルダを右クリックして
「送る」から実行するタイプのツールです。
家では同じようなものをNode.jsで作って使ってます。
言語やら実行環境やらが厳しい現場でも使いたいので、PowerShellで公開します。
便利すぎて一度使うと元に戻れないアレです。
無いとイライラしてしまう身体になるので注意。
Cドラのフォルダからバックアップ先のDドラを開いたり、
srcフォルダからビルド先のbuildフォルダを開いたりしたいときに使います。
仕様と具体例はソースコードの冒頭コメントに書いてあります。
正規表現で好きなパターンを複数書けるようにしてあるので、応用の幅が広いです。
家でも職場でも色んな場面で使えます。
ぜひぜひ。
手順
手順①:open-pair-folder.ps1というファイルを作って開いて以下のソースコードをコピペする (ファイル名はお好きに)
手順②:「変換ルール」という箇所に好きなルールを書いて、
エンコードをUFT-8 with BOMにして保存! (Shift_JISでもいいけど)
# ペアになるフォルダを開く
#
# 仕様:
# あらかじめ変換ルールをいくつか決めておいて、
# 引数で渡されたパスをそのルールに沿って変換して開きます。
# フォルダだけでなくファイルを選択しても同様の動作をします。
# 色々と応用が効きます。
#
# 具体例:
# 「C:\xxx\」を選択 ⇒ 「D:\c_drive_backup\xxx\」が開く (バックアップ先を開く)
# 「D:\c_drive_backup\xxx\」を選択 ⇒ 「C:\xxx\」が開く (バックアップ元を開く)
# 「C:\xxx\a.txt」を選択 ⇒ 「D:\c_drive_backup\xxx\」が開く (このようなファイル選択も可)
# 「src\main\webapp\xxx\」を選択 ⇒ 「work\main\webapp\xxx\」が開く (ビルド先を開く)
# 「work\main\webapp\xxx\」を選択 ⇒ 「src\main\webapp\xxx\」が開く (ソース側を開く)
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
# 変換ルール
$rules = @(
# 渡されたパスがここに書いた正規表現で置換されます (複数指定可)
# 例:バックアップ元フォルダ ⇒ バックアップ先フォルダ
@{
Pattern = 'C:\\' # \のエスケープを忘れずに!
Replacement = 'D:\c_drive_backup\' # \はエスケープ不要です!
}
# 例:バックアップ先フォルダ ⇒ バックアップ元フォルダ
@{
Pattern = 'D:\\c_drive_backup\\' # \のエスケープを忘れずに!
Replacement = 'C:\' # \はエスケープ不要です!
}
)
function Convert-PathByRules {
param(
[Parameter(Mandatory=$true)][string]$Path,
[Parameter(Mandatory=$true)][hashtable[]]$Rules
)
$out = $Path
foreach ($r in $Rules) {
$out2 = [regex]::Replace($out, $r.Pattern, $r.Replacement)
if ($out2 -ne $out) { return $out2 }
}
return $out
}
function Show-Popup {
param(
[Parameter(Mandatory=$true)][string]$Message,
[string]$Title = "open-pair-foler",
[int]$Icon = 48
)
$ws = New-Object -ComObject WScript.Shell
$null = $ws.Popup($Message, 0, $Title, $Icon)
}
function Get-BaseFolderFromSelection {
param([Parameter(Mandatory=$true)][string]$SelectedPath)
$full = (Resolve-Path -LiteralPath $SelectedPath).Path
if (Test-Path -LiteralPath $full -PathType Container) { return $full }
return [System.IO.Path]::GetDirectoryName($full)
}
if ($args.Count -lt 1 -or [string]::IsNullOrWhiteSpace([string]$args[0])) {
Show-Popup -Message "引数がありません。`r`n元となるファイルやフォルダを`r`n「送る」やドラッグ&ドロップで指定してください。"
exit 1
}
foreach ($selected in $args) {
if ([string]::IsNullOrWhiteSpace([string]$selected)) { continue }
try {
if (-not (Test-Path -LiteralPath $selected)) {
Show-Popup -Message "指定されたパスは存在しません。`r`n`r`n$selected"
continue
}
$baseFolder = Get-BaseFolderFromSelection -SelectedPath $selected
$mappedFolder = Convert-PathByRules -Path $baseFolder -Rules $rules
if ($mappedFolder -eq $baseFolder) {
Show-Popup -Message "対応するフォルダはありません。"
# 以下のポップアップメッセージでもいい
# Show-Popup -Message "渡されたファイルまたはフォルダにマッチする変換ルールがありません。"
continue
}
if (-not (Test-Path -LiteralPath $mappedFolder -PathType Container)) {
Show-Popup -Message "対応するフォルダはありません。`r`n`r`n元: $baseFolder`r`n先: $mappedFolder"
continue
}
Start-Process explorer.exe -ArgumentList "`"$mappedFolder`""
} catch {
Show-Popup -Message ("エラー: {0}`r`n`r`n入力: {1}" -f $_.Exception.Message, $selected)
}
}
- ショートカットを作成する
-
open-pair-folder.ps1のショートカットを作る - ショートカットのプロパティを開く
-
[リンク先]に以下を入力して閉じる
-
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "open-pair-folder.ps1"
手順③:送るに登録する
-
Win+Rからshell:sendtoを実行してSendToフォルダを開く - 作ったショートカットをそこに移動させる
手順④:使う
- ファイル or フォルダを右クリックする
- キーボードで
o(ショートカットの名前の先頭文字)を入力する - ペアになるフォルダが開きます!やったね!
どうやってソースコードを書いたか
最初、ChatGPTに仕様を伝えて書いてもらおうとしたんですけど、
仕様を盛り過ぎたからかPowerShellの互換性問題が色々出て来て、なかなか動かなくて。
それで、家で作って使ってるNode.jsのソースコードを食わせて、
「私が書いたこのコードは動いてるんですけど!?」と言ったらすぐ出てきました。