完、じゃないよ: 「bogus」をエミュレートしたければ皿まで

ヒド過ぎる。

2つの検証用プログラム:

myechoexe.c
1 #include <stdio.h>
2 int main(int ac, char **av)
3 {
4     int i = 1;
5     for (; i < ac; ++i) {
6         printf("%s\n", av[i]);
7     }
8     return 0;
9 }
myecho.bat
1 @echo %1
2 @echo %2
3 @echo %3

を使って色々やっててわかった。cmd.exe は「バッチを呼び出すんだね、いいことしてあげまっせ」と、とても「賢くて素敵」なことをしてくれる。上の2つは以下で argv を別の受け取り方をする:

1 c:\do\s\mes> myechoexe a b;c
2 a
3 b;c
4 c:\do\s\mes> myecho a b;c
5 a
6 b
7 c

カンマ、セミコロンなどいわゆるパスリストセパレータを千切ってしまう。「バッチを呼び出す時だけ」。

つまりワタシが書いた「dos2largv」は、argv[0] に関与しなければならないのみならず、サーチパスを検索して、「バッチなのやいなや」まで調べる必要がある。すなわち…、「静的に判定出来ない」。(そりゃそうである、「昨日はいなかったバッチがいるかもしれない」んだから。)

ダメダコリャ。

やるとすれば、「既知のバッチファイル」を利用者に与えてもらって処理するより仕方ない。環境変数 PATH だけではどうにもならぬ。


2017-11-19追記:
簡単に列挙出来ないほどしこたまダメっぷりがわかった。どれも大爆笑を禁じえないステキ過ぎる振る舞い。その中でも特にステキなのがこれ:

1 d:\o\sm\es> myechoexe.exe aaa^^ bbb
2 a^
3 b
4 
5 d:\o\sm\es> myecho.bat aaa^^ bbb
6 a@echo b
7 ECHO は <ON> です。
8 
9 d:\o\sm\es> 

バッチの中で「継続行」になってやんの。

ほかにもどうしようもないのがいっぱいわかってるが、多過ぎて列挙出来ん…。