ヒド過ぎる。
2つの検証用プログラム:
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 }
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>
バッチの中で「継続行」になってやんの。
ほかにもどうしようもないのがいっぱいわかってるが、多過ぎて列挙出来ん…。