エクスプローラーで狙ったフォルダを開くワンライナー
同じ処理を書けと言われても思い出せない
前提として、WSLを使えばたぶん行けるけど、その方法は今回パス。
主に仕事用のWindowsPCで使うことを想定して、だけど。
メールとかいろんなもので共有されたパスのフォルダをエクスプローラーで開くってのがそこそこにある。
ファイル名を指定して実行のダイアログとかエクスプローラーのアドレス履歴に貼り付けてってのがだいたいの遷移方法だと思う。
自分の場合は、ファイル名を指定して実行のダイアログを呼び出したり、エクスプローラーを起動したりってのがどうにも億劫に感じていた。
今まではVBSを使用して該当フォルダを開くっていうスクリプトを作っていて、ツールバーにスクリプトショートカットを置いて、それを起動すれば動くみたいな感じのものを使っていた。
一応VBSのものはVBSのものでエラーハンドリングもしていたし、当時使用してたコミュニケーションツールでパスを装飾することになっていたので、その装飾文字を除外するみたいな機能も盛り込んでいたりした。
機能としてはやることが単純なので、特に不満はないのだが、如何せん同じものを作ろうとしたときに、すぐに思い出せる気がしてならないのが難点。
ということで、コマンドプロンプトとかPowerShellあたりでどうにかできないかなーって思ってやってみた。
やりかたをいろいろ検討
例えば、コマンドでクリップボード操作が行える場合は、その結果を使えそう。
このためにclipコマンドを見てみるとこんな感じ。
clip /? CLIP 説明: コマンド ライン ツールの出力を Windows クリップボードにリダイレクトします。 その出力されたテキストをほかのプログラムに貼り付けることができます。 パラメーター一覧: /? このヘルプを表示します。 例: DIR | CLIP 現在のディレクトリ一覧のコピーを Windows クリップボード に貼り付けます。 CLIP < README.TXT readme.txt ファイルのテキストのコピーを Windows クリップボードに貼り付けます。
これを見る限り、クリップボードに入れることは出来ても出すことは無理。
コマンドが駄目だとすれば、PowerShellのコマンドレットではどうか。
しっかりとクリップボードから値を取得すると書かれている。
ということで、PowerShellを使用すれば値の取得は簡単にできることが分かった。
ではどうやって実行するか
値を取得したとしてもそれをどうやって実行するかだが、startコマンドやexplorerコマンドに引数として値を渡すことができればいい。
こういう場合、LinuxとかUnixではxargsコマンドを使って別コマンドに引数を渡すことができる。
例として、/hoge/fugaから一般ファイルで、ファイル拡張子がtxtのファイルを探して、それらのls -lの結果を標準出力する場合はこんな感じ。
find /hoge/fuga -type f -name "\*.txt" | xargs ls -l
ということで、コマンドプロンプトで同じようなことができないかと見てみたが、どうやらxargs相当のコマンドはないということだけがわかった。
パイプ"|"を使用することで、左のコマンド結果を右コマンドの標準入力に送り込めるというは変わらないようだけど、やりたいことは引数に値を与えたいので、この方法は使えない。
ということで、Powershellのみでクリップボードを取得して、取得した値を開くという動作を行うことをやってみる。
コマンドレットの確認
Get-Clipboardは先述の通り、値をとってくる。
Invoke-Itemはファイルやフォルダを開く。
ということで、この2つのコマンドレットでできるっぽい。
以下でやっていることはここでやっていることと同じ。 loner49th.hatenablog.com
とりあえず、PowerShellを起動して、以下を打ち込んでみるとうまく動作することが見て取れる。 ※実行前にクリップボードに「C:\」とかをコピーしておく。
$extPath = Get-Clipboard Invoke-Item $extPath
PowerShellスクリプトのセキュリティ対応
PowerShellスクリプトはセキュリティ設定によって、初期状態では実行できないようになっている。 www.atmarkit.co.jp
これを回避するために、起動用のbatを管理者権限で実行して、PowerShellスクリプトの実行許可設定を変更ののちにPowerShellスクリプトを実行。
その後に実行許可設定を元に戻すことがある。
とはいえ、この2行を実行するためにわざわざそんなことをやるぐらいなら、そんなものは作りたくないというのもあるので、powershellコマンドに実行処理を引数で渡す方法にて実現してみる。
起動方法
以下に記載の通り、powershellコマンドに引数で処理内容を記載して実行する。
powershellコマンドは引数をセミコロン";"で区切ることで、ワンライナーが実現できる。
この処理実行はコマンドプロンプトから実行できる。
powershell $extPath = Get-Clipboard; Invoke-Item $extPath
後はこれを記載したrun.batみたいなbatファイルを用意しておけば、コマンドプロンプトが起動してやりたいことをやってくれる。
ちなみに実行時にコマンドプロンプトのウインドウが表示されるのも煩わしいという場合は、batファイルのショートカットを作成し、ショートカットのプロパティから実行時の大きさを最小化に設定すればよい。