概要
- Windowsのパス文字列を他の言語に渡す際、円記号(¥)もといバックスラッシュ(\)を毎回処理するのが面倒
- エクスプローラなどのGUIメニューで選択するときにスラッシュ(/)を区切り文字とする標準的なパス文字列を取得したい。
- Powershellスクリプトを作成して、右クリックメニューの「送る(SendTo)」に登録することで簡単に取得できた。
背景
歴史的な経緯もあり*1Windowsのパスは円記号もといバックスラッシュ(\)区切り。
ただ、バックスラッシュはRやPythonといった各種プログラミング言語ではエスケープ文字として使われている。
このため、例えばRで以下のようにバックスラッシュが含まれるWindowsのパス文字列を直接利用できない。
#以下は動かない > setwd("D:\SandBox\") エラー: ""D:\S" で始まる文字列の中で '\S' は文字列で認識されないエスケープです #以下のどちらかなら動く > setwd("D:/SandBox/") > setwd("D:\\SandBox\\")
大したことではないのだが、毎度バックスラッシュを処理して渡すのはめんどくさいので簡単にしたい。
方法
Windowsのエクスプローラには、ファイル・フォルダの右クリックメニューの中に「送る(SendTo)」というメニューがある。
このメニューはSendToフォルダにあるショートカットの集合体であり、実行すると選択したファイル・フォルダを引数としてそのショートカットを起動してくれる。
そこで、エクスプローラ上で簡単にバックスラッシュをスラッシュに変換した文字列を取得するために、パス文字列を変換するスクリプトを作成してそのショートカットをSendToに登録した。
これでファイル・フォルダを右クリックしてショートカットを選択すると、スラッシュで区切られた文字列を取得できるようになる。
以下のようなGet-FilePathWithSlash.ps1
を作成する。cf.Powershell上で、パイプで渡すと文字化けする。
$OutputEncoding = [System.Text.Encoding]::GetEncoding('shift-jis') $args[0] -replace "\\", "/" | clip.exe
追記 2018-07-04
上記だとクリップボードに改行が入っていしまうのでPowershell5.0以上が入っている環境なら以下のようにした方が良い
$OutputEncoding = [System.Text.Encoding]::GetEncoding('shift-jis') $args[0] -replace "\\", "/" | Set-Clipboard
SendToフォルダの場所を確認する。cf.【PowerShell】SendToフォルダを表示するスクリプト2 | ほそぼそプログラミング日記
#SendToフォルダの場所 [Environment]::GetFolderPath('SendTo') Path ---- C:\Users\majima_ko16\AppData\Roaming\Microsoft\Windows\SendTo
上記のフォルダにショートカットを任意の名前で作成し、プロパティのリンク先を以下のように書き換える。 cf. 「送る」with PowerShell - なにか作る
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle Hidden -File "D:\<scriptPath>\Get-FilePathWithSlash.ps1"
その他
この方法を応用するとでCygwin用のパスも作れるだろう(cygpathはあるが)。
*1:日本語では、バックスラッシュと円記号の悲劇 - 仮想と現実に詳しい。またおそらく元ネタはWhy is the DOS path character ""? – Larry Osterman's WebLogだろう。