ドラッグアンドドロップでパスの区切り文字を変更してクリップボードにコピーするPowerShell

# ファイルパスの区切り文字を変更
Windowsだとパスの区切り文字は "\\"（逆スラッシュ、￥） だけど、場合によっては "\\\\"（￥を2つ並べる）を使ったり、 "/"（スラッシュ） を使わなければいけないケースがあります。例えば、psqlのメタコマンドで "\i "コマンドとか、Apache系の設定ファイルとかに記載する時なんかに使います。
```powershell:こんな書き方をしたい時がある
# 元のパス区切り文字は "\" だけど、
C:\Users\qsuke\Documents\sql\hoge.sql
# こういう書き方や
C:\\Users\\qsuke\\Documents\\sql\\hoge.sql
# こういう書き方をすることもある
C:/Users/qsuke/Documents/sql/hoge.sql
```
ファイルのフルパスを取得したい時はWindowsエクスプローラのアドレスバーからコピーしたり、コマンドウインドウにドラッグアンドドロップしてから "\\" を "\\\\" や "/" に書き換えたりしますが、長いパス名になると意外と面倒くさいし間違えたりします。そんな時に簡単に変換できる手抜きツールです。powershellで作ったのでインストール不要で下記のソースコードをコピーすればすぐに使えます。
## 要件
* Windowsエクスプローラからドラッグアンドドロップして、フルパス名の区切り文字 "\\" を "\\\\\\" か "/" に書き換える。
* 書き換え後のテキストはクリップボードにコピーする。
* 引数によって、"\\" を "\\\\\\" に変換するパターンと "\\" を "/" に書き換える2パターンの処理が行える。
## ソースコード
```powershell:changedelim.ps1
# パラメータ
#  -Type 0 は \\ に変換
#  -Type 1 は / に変換
Param($Type=0)

# System.Windows.Formsを使います
Add-Type -AssemblyName System.Windows.Forms

$titles = @("（\ → \\）", "（\ → /）")
$initial_text = "ここにドラッグアンドドロップしてね"

# Formの定義
$form = New-Object System.Windows.Forms.Form
$form.Text = "パス区切り文字変換" + $titles[$Type]
$form.Size = "420,120"
$form.StartPosition = "Manual"
$form.Location = "0,0"
$form.FormBorderStyle = "SizableToolWindow"
$form.MaximizeBox = $False

# ドラッグアンドドロップされるLabelの定義
$label1 = New-Object System.Windows.Forms.Label
$label1.Location = "2,2"
$label1.Size = "400,60"
$label1.BorderStyle = "FixedSingle"
$label1.Anchor = "Top,Bottom,Left,Right"
$label1.BackColor = "White"
$label1.ForeColor = "ControlDark"
$label1.AllowDrop = $True
$label1.Text = $initial_text

# Label1のDragEnterイベント
$DragEnter = {
    $_.Effect = "All"
}

# Label1のDragDropイベント
$DragDrop = {
    $filename = @($_.Data.GetData("FileDrop"))
    if ($Type -eq 0){
        $filename2 = $filename.Replace("\", "\\");
    }else{
        $filename2 = $filename.Replace("\", "/");
    }
    Set-Clipboard $filename2
    $label1.Text = $filename2
    $label1.ForeColor = "ControlText"
}

# Label1のイベントハンドラ定義
$label1.Add_DoubleClick(
    # ダブルクリックでLabelを初期化
    {$label1.Text=$initial_text;$label1.ForeColor = "ControlDark"}
)
$label1.Add_DragEnter($DragEnter)
$label1.Add_DragDrop($DragDrop)
$form.Controls.AddRange(@($label1))

# ダイアログ画面で表示
$form.Showdialog()
```
## 起動方法
```powershell
PS C:\Users\qsuke> changedelim.ps1 -Type 1
```
## 実行イメージ
### 初期表示時
-Type 0で起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106424/23cba996-7dd8-3169-4313-149a78f7a158.png)
-Type 1で起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106424/6415c519-5c46-46c4-61eb-b9a25b75aaec.png)
### ドラッグアンドドロップした後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106424/e0daafd8-b177-a4ba-7deb-286c209c9a64.png)
**変換後の文字列が表示され、クリップボードにコピーされます。**
**ドラッグエリアをダブルクリックすると初期表示時の状態に戻ります。**
## 応用
バッチファイルを作っておけばダブルクリックだけで起動可能です。上記のpowershellと同じフォルダ内に置いておきます。
```bat:changedelim0.bat（-Type 0 で起動）
@echo off
rem コマンドウィンドウを最小化しておくおまじない
@if not "%~0"=="%~dp0.\%~nx0" start /min cmd /c,"%~dp0.\%~nx0" %* & goto :eof
powershell -c ".\changedelim.ps1 -Type 0"
@echo on
```
```bat:changedelim1.bat（-Type 1 で起動）
@echo off
rem コマンドウィンドウを最小化しておくおまじない
@if not "%~0"=="%~dp0.\%~nx0" start /min cmd /c,"%~dp0.\%~nx0" %* & goto :eof
powershell -c ".\changedelim.ps1 -Type 1"
@echo on
```