コマンドプロンプトにおけるコマンドライン引数の展開
こんにちは。
コマンドプロンプトにおける、コマンドライン引数の展開のされ方について、質問させて下さい。
具体的に言うと、二重引用符で囲まれたコマンドライン引数が、
どのようにして各コマンドに渡されるのかを詳しく知りたいと思っています。
まずコマンドプロンプトが、コマンドラインの特殊文字を展開し、
それらが各コマンドに渡される事は知っています。
特に、2つの二重引用符で囲まれた文字列に含まれる特殊文字は普通の文字として扱われる事、
二重引用符は「\」によってエスケープできる事は知っています。
これらを理解した上で、以下のような事を試しました。
まず、以下のような、1.cというCプログラムを作成し、ビルドしました。
____________________
#include <stdio.h>
int main(int argc,char *argv[])
{
int i;
for(i=1; i<=9; i++)
if(argv[i])
printf("argv[%d]=「%s」\n", i, argv[i]);
return 0;
}
____________________
次に以下のようなバッチスクリプトを作成しました。
____________________
@echo off
echo %%~1:「%~1」
echo %%~2:「%~2」
echo %%~3:「%~3」
____________________
その後、以下のようにして同じコマンドライン引数を、これらのプログラムに渡すと、
以下のような結果になりました。
____________________
C:\Users\kei
>1.exe "\"ab c\"" de
argv[1]=「"ab c"」
argv[2]=「de」
C:\Users\kei
>1.bat "\"ab c\"" de
%~1:「\"ab」
%~2:「c\""」
%~3:「de」
____________________
なぜ両者の出力結果に、違いが出るのかが分からず困っています。
コマンドプロンプロの仕様だと、1.exeの出力は予想通りだったのですが、
1.batの出力では、コマンドライン引数がスペースで区切られていると、
それらを二重引用符で囲んでも、1つの引数としてみなしてくれませんでした。
これだけでは不十分だと思い、以下のように、
Windowsコマンドではない、ダウンロードしてきたlessと
Windowsコマンドであるtypeで、同じ事を試しました。
____________________
C:\Users\kei
>less "\"ab c\"" fa
ab c: No such file or directory
fa: No such file or directory
C:\Users\kei
>type "\"ab c\"" fa
指定されたファイルが見つかりません。
処理中にエラーが発生しました: \ab
パラメータが間違っています。
____________________
この結果をみると、lessでは1.exeと同じようにコマンドラインが解釈され、
moreでは1.batと同じようにコマンドラインが解釈されているようです。
こういった事実は
「まずコマンドプロンプトが、コマンドラインの特殊文字を展開し、
それらが各コマンドに渡される」
というコマンドプロンプトの仕様と矛盾しているので、頭が混乱しています。
こういった問題について、何か御存じの方がいらっしゃれば、情報提供をお願い致します。
長くなりましたが、よろしくお願い致します。
お礼
プログラム内にじかに書いているので上記処理はできないとおもいます。 ただこんなこともできるということを初めてりしました。 ありがとうございます。 方法は自己解決しました。