Launch-Software "プレーンテキストリンクを用いた汎用ランチャーの実装"

テキストファイルに書かれたリンクからアプリケーションを起動する。

目次

はじめに

Summary: テキストに書かれたリンクからアプリを起動するCLI用PowerShellスクリプト「Invoke-Link (Alias:i)」を作った話。

Windowsのショートカットファイルは便利だ。よく使うアプリケーションやWebリンク、ファイルパスを登録しておけば素早くアクセスできる。ショートカットファイルはデスクトップや任意のフォルダにどこでも気軽に配置できる。

このショートカットファイルの使い勝手に関して、いくつかの不満がある。たとえばショートカットファイルを作成するのは少し面倒だ。それと、一度に複数のリンクを登録できない。ショートカットファイル(.lnk)はバイナリファイルなので、Gitなどのバージョン管理システムで差分を管理しづらい。

できれば、テキストファイルにリンクを書いて、そのままそれを実行できるようにしたい。そんな考えからPowerShellスクリプト「Invoke-Link  (Alias:i)」を書いてみた。小さな工夫だが、「どこにファイルを置いたっけ?」と一瞬迷うことによる作業や思考の流れの中断を低減するちょっとした助けになるかもしれない。

前提条件

問題をとく

1. 問題を理解する

問題を整理する。 Windowsのショートカットファイル(.lnk)について:

利点・便利な点

分類 利点 対応方針
起動と配置 ・素早くアプリやファイルを起動できる
・好きな場所に配置可能
・カレントディレクトリから移動せずに起動可能
現行の利点を活かしつつ、テキストファイル管理との連携で即時実行を維持する

不満・問題点

分類 不満・問題点 対応方針
作成の手間 .lnkファイルの作成が手間 テキストファイル形式に移行し、リンク作成の簡素化を図る
複数リンクの管理 1つのショートカットファイルに複数リンクを登録できず、一度に複数リンクを起動できない テキストファイルに複数リンクを記述し、一括起動が可能な仕組みを導入する
バージョン管理 バイナリ形式のため、Gitでの差分管理が困難 テキストベースの管理に切り替え、Gitなどのバージョン管理システムでの差分把握や共有を容易にする
環境依存性 .lnkファイルはWindows OSに依存する テキストファイル形式に移行し、OSに依存しないリンク管理を実現する

2. 計画をたてる

以下に、テキストファイルでリンクを管理・実行するためのスクリプトの実装方針を示す:

課題  対策計画 
起動の迅速さと利便性の維持 ショートカットファイルの利点を保持し、カレントディレクトリから移動せずにアプリやファイルを起動可能な仕組みを構築する
テキストファイル形式の採用 バイナリ形式ではなくテキストファイルでリンク情報を管理し、Gitでの差分管理やバージョン管理を容易にする
複数リンクの一括管理 1つのテキストファイルに複数のリンクを記載し、必要に応じてまとめて起動できる仕組みを提供する
環境依存性の排除と移植性の向上 OS依存のショートカットから脱却し、クロスプラットフォームで運用できるテキストベースのリンク管理を実現する

3. 計画を実行する

インストール

PowerShellスクリプト:「Invoke-Link (Alias:i)」をインストールする。

  1. pwsh-sketchesのインストール
  2. ドットソースで関数を読み込み
    • . path/to/the/pwsh-sketches/src/Invoke-Link_function.ps1
  3. テスト
    • man i or
    • man Invoke-Link

実行

それでは、「Invoke-Link 」を実際に使ってみよう。 まず最初にWebリンクを既定のブラウザで起動してみる。

テキストファイルbtklab.txtを作成し、以下の2行を記述する。

https://btklab.com
https://github.com/btklab

以下のコマンドで、テキストファイルに記載されたリンクを実行する。 この場合はテキストの一番最初に書かれたリンク(https://btklab.com )のみ「既定のブラウザ」で開く。

i btklab.txt

-Docオプションで、2番目以降のリンク(https://github.com/btklab )を開く。

i btklab.txt -Doc

-All(-a)オプションを指定した場合、「既定のブラウザ」でテキストファイルに書かれたすべてのリンクを開く。

i btklab.txt -All

Webリンクのほか、ファイルやディレクトリのフルパスも指定できる。ダブルクオートはあってもなくてもよい。 テキストファイルpub-documents.txtを作成し、以下のように記述する。

"C:/Users/Public/Documents"

以下のコマンドで、パスに指定したディレクトリがエクスプローラーで開く。

i pub-documents.txt

起動するアプリは、Webリンクの場合は「既定のブラウザ」、ディレクトリの場合は「エクスプローラ」、ファイルの場合は拡張子に応じた「既定のアプリ」である。他、引数にWindowsショートカットファイル(.lnkファイル)を指定した場合は、ショートカットファイルを起動する。これにより、リンク集フォルダにテキストファイルリンクとWindowsのショートカットファイルを混在させても、統一的にInvoke-Link コマンドで起動できる。

4. ふりかえり

今回紹介したInvoke-Link コマンドは、ぼくの日常的な作業を効率化するために作ったもので、その狙いは以下の4点に集約される。

  1. 起動の迅速さと利便性を保ちつつ、
  2. テキストファイルでリンク情報を管理し、
  3. 複数のリンクを一括で管理・起動できること、
  4. さらに環境依存を排し、移植性を高めること。

これらの課題はおおよそ満たされ、Invoke-Link コマンドは現在、ぼくの使用頻度の高いコマンドの一つとなっている。

課題  結果  評価
起動の迅速さと利便性の維持 カレントディレクトリから移動せずにアプリやファイルを起動可能
テキストファイル形式の採用 テキストファイルでリンク情報を管理し、Gitでのバージョン管理が可能
複数リンクの一括管理 1つのテキストファイルに複数のリンクを記載し、必要に応じて一括で起動可能
環境依存性の排除と移植性の向上 テキストファイルとPowerShellの組み合わせでクロスプラットフォーム化

リンクファイルの配置について

では具体的に、ぼくの環境でのリンクファイルの管理方法を紹介しよう。 ぼくの作業のホームディレクトリは以下のとおりだ。

C:\Users\btklab
├───cms
│   └───drafts        <-- my working directory!

作業ディレクトリdraftsの直下にworkというサブディレクトリを作り、そこにリンクファイルを格納している(workの名前に深い意味はない。単に入力しやすいと考えただけだ。linkなどでもよさそうだ):

C:\Users\btklab
├───cms
│   └────drafts       <-- my working directory!
│          └────work  <-- link file stock directory!
│               │─amazon.txt
│               │─bing.txt
│               │─chrome.txt
│               │─copilot.txt
│               │─e-tax.txt
│               │─firefox.txt
│               │─gemini.txt
│               │─gmail.txt
│               │─google.txt
│               │─googlecalendar.txt
│               │─googledrive.txt
│               │─jetro.txt
│               │─kagisearch.txt
│               │─kuroneko.txt
│               │─netflix.txt
│               │─outlook.txt
│               │─onedrive.txt
│               │─oxford-dictionary.txt
│               │─...
│               │─thunderbird.txt
│               │─youtube.txt
│               └─github.txt

このフォルダには、WebサイトのURL、ローカルファイルの絶対パス、アプリの実行ファイルパス、Windowsショートカット(.lnk)、PowerShellスクリプト(.ps1)など、200を超えるリンクファイルがある。たくさんあるけれど、その中でも特によく使うのは、約10個程度だ。

リンクファイル命名のポイント:思考の流れにすなおにしたがうこと

リンクファイルの命名でぼくが優先しているのは、「思いついたそのままの名前と順序でファイル名を作ること」だ。 例えば、Outlookを起動したいときは素直にoutlook.txtと名付ける。 これにより、思考の流れをそのままコマンドに反映できる。

  • 「Outlookを開きたいな」→ i ./work/outlook.txt

一方で、ol.txt のような省略名を使う選択肢もあるが、これには注意が必要だ。 省略名の場合、思考の流れが次のようにひと手間増える

  • 「Outlookを開きたいな」→「省略名なんだっけ?」→「たしかolだった」→ i ./work/ol.txt

短縮名は入力の手数が減るという点において効率的といえるが、「思考→入力」の途中で「名前を思い出す」ための余計なステップが発生してしまう。ぼくにとっては、この思考の流れの自然さを妨げないことのほうが、入力効率よりもずっと重要だ。

コマンド命名とオプション設計の考え方

こうした「思考の順序に沿った命名やオプションの指定」は、Invoke-Link に限らず、ぼくがCLIコマンドを設計するときの基本原則にしている。コマンドを覚えなくとも直感的に使えるようにすることが、作業のストレスを減らし、長期的な生産性向上につながる。

用語

読者の理解と学習をより深めるための、リンクやショートカットを活用した効率化の観点でのいくつかの技術用語:

CLI(コマンドラインインターフェース)

文字でコンピューターに指示を出す方法。マウスでアイコンをクリックするGUI(グラフィカルユーザーインターフェース)とは異なり、キーボードで命令(コマンド)を入力して、ファイルを開いたり、プログラムを実行したりする。このブログで紹介するのは主にCLIを用いた方法。

別名(エイリアス:Aliases)

PowerShellやその他のシェルで、頻繁に使うコマンドやスクリプトに短縮名(エイリアス)を設定する仕組み。今回の「Invoke-Link 」で「i」というエイリアスを設定した理由は、当スクリプトが日常的にたくさん手入力されることが予想されたため。

シンボリックリンク:Symbolic Link

Windowsのショートカットファイル)(.lnk)はシンボリックリンクの一種。オペレーティングシステムのファイルシステム内で、あるファイルやディレクトリへの参照(ポインタ)を作成する機能。

Workflow Automation

当記事で扱った内容の分類は、日常の手動作業をスクリプトや自動化ツールで効率化する考え方。リンクやショートカット、別名を駆使して、アプリ起動やファイルアクセスの操作を自動化・迅速化する手法。

pwsh-sketches – 実験的なCLI用PowerShellスクリプト集(GitHubリポジトリ)

Invoke-Link : テキストファイルに書かれたリンクを既定のアプリケーションで起動するCLI用PowerShellスクリプト。ぼくがpwsh-sketches の中でもっともよく使うコマンドの一つ。