コマンド行情報のやり取りの仕組み


やり取りされるデータの形式

pipeline)は、最初のバージョンから、コマンド行情報をディスクに保存するときには、バッチファイルの形式を使っていましたが、ver.2.0以降のPCKでは、GUIフロントエンド相互間でコマンド行情報をやり取りするとき全般でバッチファイル形式を使うことにしました。つまり、GUIフロントエンドの「コピー」ボタンを押したとき、コマンド行の左横の□をクリックして他のウィンドウにドラッグしたとき、コンテキストメニューの「(bat保存」コマンドを選択したときに(以上の操作をまとめてエキスポートと呼ぶことにします)、ファイルやクリップボードに書き込まれるのは、この形式のデータですし、他のGUIフロントエンドからドラッグしてきたデータをドロップしたり、コンテキストメニューの「(batロード」、「貼り付け」コマンドを選択したときに(以上の操作をまとめてインポートと呼ぶことにします)、GUIフロントエンドが読み込むのは、この形式のデータです。この形式は、ディスクファイルになっていれば、MS-DOS/コマンドプロンプトウィンドウで通常のバッチファイルとして実行することができます。しかし、コメント行を使ってGUIフロントエンドが必要とする情報を提供するようになっていますので、この形式以外のバッチファイルはGUIフロントエンドではロードできません。また、ver.2.0では、バッチファイル自体の形式を若干変更しました。ver.2.0GUIフロントエンドは、古い形式のバッチファイルもロードできますが、ver.1.xではver.2.0以降のバッチファイルをロードすることはできません。

具体例を使って説明しましょう。次に示すのは、4つのアイテムから構成されるパイプラインを表現するバッチファイルです。

 

@echo off

chdir C:\works

rem for Pipeline fe C:\Program Files\longtail\cmdline\foldfe.exe 0 4 13

rem for Pipeline fe c:\program files\longtail\cmdline\catfe.exe 47 3 2

rem for Pipeline fe C:\Program Files\longtail\cmdline\wcfe.exe 55 2 0 sa5

rem for Pipeline fe c:\program files\longtail\cmdline\awkfe.exe 64 4 48

set PATH=C:\Program Files\longtail\cmdline;C:\ubin;C:\works\gnu; C:\WINNT\system32;C:\WINNT;C:\WINNT\System32\Wbem;c:\ubin

fold -m -w 40 -t 8 %1 %2 %3 %4 %5 %6 %7 %8 %9 |cat -s |wc *.f -|gawk -v "pagep=3000" -f

 

1行目は、かならず@echo offになります。この行がないだけで、ロードは失敗します。バッチファイルをMS-DOS/コマンドプロンプトで実行すると、この行があるおかげで、バッチファイルの内容は画面に表示されません。

2行目は、chdirコマンド行です。バッチファイルとして実行した場合、コマンド行はこの行で指定されたディレクトリをカレントディレクトリとして実行されます。ここで指定されるディレクトリは、保存、ドラッグ、コピー時のGUIフロントエンドのカレントディレクトリです(カレントディレクトリを指定できないGUIフロントエンドの場合、移動先として「.」を指定します。カレントディレクトリに移動するということは、カレントディレクトリを変更しないということです)。データをインポートしているのがで、「設定」ダイアログの「ロード/貼り付け時にディレクトリ移動しない」がチェックされている場合には無視されますが、データをエキスポートするときにはかならずそのときの作業ディレクトリがバッチファイルの2行目に記録されます。指定されたディレクトリが存在しない場合には、次のような警告のためのメッセージボックスが表示されます。

 

 

3行目からの数行のコメント行は、GUIフロントエンドの初期化を助けます。この行が複数あるデータはしかインポートできませんが、この行が1行だけなら、行に書かれているGUIフロントエンドでもインポートできます。なお、にインポートした場合、この部分の行数がメインダイアログのアイテム数になります。

以外のGUIフロントエンドに対応する行は、冒頭がrem for Pipeline feになっています。次の部分は、GUIフロントエンドのファイル名です。先ほども触れたように、この情報は、インポートできるGUIフロントエンドの判定に使われるほか、にインポートする場合には、メインダイアログに表示される漢字アイコンを決めたり、ダブルクリックされたときに起動すべきGUIフロントエンドを決めたりするために使われます。その後ろの3つの数値は、このコメント行の直後にある実際のコマンド行のなかでのコマンドの位置、コマンド名部分の長さ、オプション部分の長さです。wcfeのための行にだけ含まれているsa5というのは、入力の指定です。1字目はfscのどれかで、それぞれ入力ダイアログの「リストを使って指定する」、「直接指定する」、入力グループ内の「クリップボード」チェックボックスに対応しています。2文字目は、1文字目がfsだったときに限り使われ、amです。aなら補助入力、mならメイン入力を表します。その後ろも、1文字目がfだったときに限り使われる情報で、入力情報の長さを示します。この場合補助入力として「*.f -」という5字の文字列をwcに与えることを指示しています。

cmdline)のための行は、冒頭がrem for Pipeline clになっています。たとえば、次に示すのは、「cat」というだけの内容のコマンド行を表示しているからエキスポートされるデータです。

 

@echo off

chdir C:\works

rem for Pipeline cl 0 c:\program files\longtail\cmdline\cmdline.exe 0 3 n4

set PATH=C:\Program Files\longtail\cmdline;C:\ubin;C:\works\gnu; C:\WINNT\system32;C:\WINNT;C:\WINNT\System32\Wbem;c:\ubin

cat %1 %2 %3 %4 %5 %6 %7 %8 %9

 

rem for Pipeline clの後ろはプログラムのファイル名、そのあとの2つの数値はコマンド行のなかでのコマンドの位置と長さです。メインダイアログ内の先頭アイテムになる場合には、これら2つの数値の後ろにf<数値>-<数値>s<数値>-<数値>n<数値>c<数値>のどれかが続きます。fsの意味は以外のGUIフロントエンドのときと同じで、最初の数値が入力情報の位置、次の数値がそのサイズを指定します。ncは、この例でも使われている%1 %2 %3 %4 %5 %6 %7 %8 %9 を示します。そして、cの場合は「クリップボードの内容を標準入力として使う」チェックボックスがチェックされます。文字の直後の数値はこれが入る位置を示します。ハイフンのあとの数値は、入力ファイル情報の長さです。nの場合は長さが決まっているので長さ情報はありません。

次は、指定すべき環境変数を設定するsetコマンド行です。「保存」コマンドを実行したときに、「環境変数設定」ダイアログの下のリストに含まれている環境変数がここに書き込まれます。また、そのような環境変数がない場合でも、「保存」コマンドを実行したときの環境変数PATHの内容は、書き込まれます。

最後の行は、実際のコマンド行です。GUIフロントエンドのコマンド行表示部には、このなかの%1 %2 %3 %4 %5 %6 %7 %8 %9を実際の入力指定に置き換えたものが表示されます。MS-DOS/コマンドプロンプトでこのファイルをバッチファイルとして使うときは、chdirコマンド行で指定されたディレクトリに移動し、setコマンド行で指定された環境変数を設定したあとで、このコマンド行が実行されます。

古い形式は、カレントディレクトリや環境変数の指定がコメントになっており、環境変数設定行がコマンド行の後ろになっていました。また、ドラッグアンドドロップで送られるデータや「編集」ボタンを押したときに起動されるフロントエンドに渡されるファイルの内容も、これとは大きく異なるものでした。しかし、バッチファイルとして利用するときの便宜を考えて、現行のように変更しました。また、すべてのインポート、エキスポートの場面で同じ形式を使うことにより、以前よりも柔軟なインポート、エキスポートが実現されました。

インポート、エキスポートできる方向

 ver.1のときは、バッチファイルをロード、保存できるのはだけでした。また、コマンド行情報は、以外のGUIフロントエンドからに送ることができるだけでした。一度にセットされてしまったコマンド行情報は、特殊モードでGUIフロントエンドを起動することによって編集することはできましたが、同じ設定のスタンドアロンのGUIフロントエンドが必要な場合には、手作業で同じ設定を作らなければなりませんでした。ver.2には、「起動」ボタンが追加され、このようなGUIフロントエンドウィンドウをただちに作れるようになりました。ただし、起動されたGUIフロントエンドの編集結果は、GUIフロントエンドをクローズしただけでは、には反映されません。従来と同様の特殊モードでの起動には、「編集」ボタンを使います。「編集」ボタンで起動されたGUIフロントエンドからはコマンド行プログラムを実行することはできませんが、「OK」ボタンを押してGUIフロントエンドをクローズすると、クローズ時のGUIフロントエンドの設定がのパイプラインに反映されます。「編集」ボタンで起動されたGUIフロントエンドは、画面の左側に充分な余裕があればの真横に表示されますが、「実行」ボタンで起動されたGUIフロントエンドは画面中央に表示されるという違いもあります。なお、[Shift]キーを押しながらのメインダイアログ内のアイテムをダブルクリックすると「起動」ボタン、[Shift]キーを押さずにダブルクリックすると「編集」ボタンと同じ意味になります。

ver.1には、ドラッグアンドドロップに対応するコピーアンドペースト操作はありませんでしたが、ver.2には、コピーアンドペーストが追加されました。ただし、「貼り付け」ボタンがあるのはだけで、ほかのGUIフロントエンドではダイアログを右クリックしたときに表示されるコンテキストメニューから「貼り付け」コマンドを選択しなければなりません。

ver.1では、からどこかにデータをドラッグアンドドロップすることはできませんでしたが、ver.2では、からもデータをコピー、ドラッグすることができます。後述のように、メインダイアログでアイテムが選択されている場合にはそのアイテムだけを対象とするデータ、選択されていない場合にはパイプライン全体を対象とするデータがコピー、ドラッグされます。

ver.2では、すべてのGUIフロントエンドでバッチファイルをロード、保存できるようになりました。GUIフロントエンドのコマンド行引数としてバッチファイルを指定すると、GUIフロントエンドはそのバッチファイルの内容を解釈しようとします(解釈できないバッチファイルを与えたときには内容を無視し、ドラッグアンドドロップ以外の操作では、次のような警告メッセージを表示します)。

 

 

なお、以外のGUIフロントエンドは、rem for Pipeline行が1つだけでこのコメント行内で自分のプログラム名が指定されているデータ以外、インポートできませんが、は、GUIフロントエンドがエキスポートしたデータなら何でもインポートできます。

ver.1の「ロード」コマンドは、まずパイプライン全体をクリアしてからでなければ、バッチファイルをロードできませんでしたが、ver.2では次のメッセージボックスによって、クリアするか追加するかを選べるようになりました。「いいえ」を選択すれば、追加という意味になります。

 

 

また、ドラッグアンドドロップ、コピーアンドペーストで複数のアイテムを追加するときには(この条件が満たされるのは、からにドラッグアンドドロップ、コピーアンドペーストしたときに限られます)、上記のメッセージボックスが表示されます(1つのアイテムを追加するときには、無条件で追加を選択します。しかし、でのロードの場合には、バッチファイルに含まれるアイテムが1つだけでも、クリアか追加を尋ねてきます)。

ver.1の「保存」コマンドは、無条件でパイプライン全体を保存していましたが、ver.2は、メインダイアログで選択されているアイテムがある場合には、そのアイテムだけを対象とするデータ、選択されているアイテムがない場合には、パイプライン全体を対象とするデータをエキスポートします。

ver.1では、ドラッグアンドドロップ、ロードと保存の操作で入力ファイル情報をやり取りすることはできませんでしたが、ver.2では、[Shift]キーを押しながら、コマンド行の左の□をクリックしたときに表示されるメニューから「メイン入力に移動」、「補助入力に移動」を選択すれば、オプション情報と同時に入力ファイル情報も移動できます。送り先が以外なら、どちらを選択しても同じで、入力ファイルとしてそのフロントエンドが受け付けるタイプのものを受け付ける数だけ受け付けます。送り先がなら、どちらを選ぶかによって、入力情報がのメイン入力に送られるか、個々のアイテムの補助入力に送られるかが決まります。なお、「補助入力に移動」が表示されるのは、のメインダイアログで選択したときに「補助入力」ボタンが有効になるようなGUIフロントエンドだけです。

ver.1は、インポートをサポートしていませんでしたが、ver.2はすべてのGUIフロントエンドからのデータをインポートできます。ただし、からエキスポートされたデータをインポートできるのはだけです。

バッチファイルからの起動

ver.2では、エクスプローラでPCKが作ったバッチファイルが表示されているときに、そのバッチファイルをダブルクリックすると、対応するGUIフロントエンドが起動するようになりました。

 

 

対応するGUIフロントエンドとは、rem for Pipeline行が複数あれば、そうでなければ、rem for Pipeline行で指定されたプログラムです。ですから、以外のGUIフロントエンドで保存したバッチファイルは、そのプログラムによって起動されます。の場合は、「保存」ボタンを押したときに、メインダイアログ内に選択されたアイテムがある場合や、メインダイアログ内のアイテムが1個だった場合には、そのアイテム、そうでなければということになります。

この機能は、個々のGUIフロントエンドと、pckbps.exe)、pckext.dllの連携によって成り立っています。

まず、pckext.dllは、上図のように、PCKで作ったバッチファイルのみ、GUIフロントエンドのアイコンで表示するように、エクスプローラの動作を変えます。PCKで作ったバッチファイルは、先ほど説明したように、独特の形式を持っています。pckext.dllは、エクスプローラが表示しようとしているフォルダのなかの拡張子が.batのファイルを11つ覗き込み、rem for Pipeline行の数と内容から表示すべきアイコンを指定します。

なお、pckext.dllは、エクスプローラ内でマウスを右クリックしたときのコンテキストメニューにPCKのためのアイテムを追加する仕事もしています。単一のフォルダを選択してコンテキストメニューを表示したときには、「ここで「行」を実行」、「ここで「管」を実行」の2つのコマンドを追加します。単一のPCKバッチファイルを選択したときには、「「行」から開く」、「「管」から開く」の2つのコマンドを追加します。その他の単一のファイルを選択したときには、「「行」で実行する」コマンドを追加します。

エクスプローラでバッチファイルをダブルクリックすると、バッチファイル名をコマンド行パラメータとしてpckbps.exeが起動されます(もちろん、PCKがインストールされていないシステムでは、バッチファイルが単純に起動されます。pckbps.exeが起動されるのは、PCKがインストールされているシステムだけです)。pckbps.exeは、pckext.dllとまったく同じアルゴリズムでバッチファイルに対応するGUIフロントエンドを判断し、バッチファイル名をコマンド行パラメータとしてそのGUIフロントエンドを起動します。バッチファイルがPCKによって作られたものでなければ、通常通りに実行します。

最後に、コマンド行パラメータとして拡張子が.batのファイルを受け取ったGUIフロントエンドは、.そのファイルを読み込み、解釈できれば(pckbps.exeから起動された場合、かならず解釈できるはずですが)、.batファイル内の設定によって自分を初期化します。この機能は、ver.2GUIフロントエンドに追加されたものですので、何かの間違いでver.1GUIフロントエンドが起動されてしまった場合には、正しく動作しません。