1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-09-05

ファイルパスの区切り文字を変更

Windowsだとパスの区切り文字は "\"(逆スラッシュ、¥) だけど、場合によっては "\\"(¥を2つ並べる)を使ったり、 "/"(スラッシュ) を使わなければいけないケースがあります。例えば、psqlのメタコマンドで "\i "コマンドとか、Apache系の設定ファイルとかに記載する時なんかに使います。

こんな書き方をしたい時がある
# 元のパス区切り文字は "\" だけど、
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パターンの処理が行える。

ソースコード

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()

起動方法

PS C:\Users\qsuke> changedelim.ps1 -Type 1

実行イメージ

初期表示時

-Type 0で起動
image.png
-Type 1で起動
image.png

ドラッグアンドドロップした後

image.png
変換後の文字列が表示され、クリップボードにコピーされます。
ドラッグエリアをダブルクリックすると初期表示時の状態に戻ります。

応用

バッチファイルを作っておけばダブルクリックだけで起動可能です。上記のpowershellと同じフォルダ内に置いておきます。

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
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
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?