Windowsは実際には、生のコマンドライン全体を単一の文字列としてプログラムに渡します。GetCommandLineを参照してください。を作成する場合main(int argc, char **argv)
、プログラムがリンクしているCランタイムライブラリは、コマンドラインをの単語に分割する役割を果たしますargv
。
したがって、より多くの情報が必要です。シェルとは何か、コマンドをどのように呼び出すか、どのCランタイムライブラリを使用しているか。あなたが目にしている問題は間違いなくWindows自体ではなく、cmd.exeとMSVCのCRTでここで再現することはできません。
C:>タイプCON> test.c
#include <stdio.h>
int main(int argc、char ** argv){
int i;
printf( "%d \ n"、argc);
for(i = 0; i <argc; i ++)
printf( "[%d] <%s> \ n"、i、argv [i]);
0を返します。
}
^ Z
C:\> cl test.c
Microsoft(R)32ビットC / C ++最適化コンパイラバージョン15.00.30729.01(80x86用)
Copyright(C)MicrosoftCorporation。全著作権所有。
test.c
Microsoft(R)インクリメンタルリンカーバージョン9.00.30729.01
Copyright(C)MicrosoftCorporation。全著作権所有。
/out:test.exe
test.obj
C:\> test.exe *
2
[0] <test.exe>
[1] <*>
C:\>
CygwinのCRTを使用し、CygwinのBashシェルから実行した場合も、問題は発生しません。
C:\> C:\ cygwin \ bin \ bash -l
$ cd / cygdrive / c
$ cc test.c
$ ./a.exe'*'
2
[0]<./a>
[1] <*>
$
cmd.exeからCygwinのCRTを使用してプログラムを実行し、それらを混合しようとした場合にのみ、問題が発生する可能性があります。
$出口
C:\> a.exe *
19
[0] <a>
[1] <AUTOEXEC.BAT>
[2] <BOOT.INI>
[3] <CONFIG.SYS>
[4]<ドキュメントと設定>
[5] <IO.SYS>
[6] <MSDOS.SYS>
[7] <NTDETECT.COM>
[8] <NTLDR>
[9]<プログラムファイル>
[10] <RECYCLER>
[11]<リサイクル>
[12]<システムボリューム情報>
[13]<ウィンドウ>
[14] <cygwin>
[15] <hiberfil.sys>
[16] <pagefile.sys>
[17] <temp>
[18] <a.exe>
C:\>
しかし、二重引用符で問題は発生しません。
C:\> a.exe "*"
2
[0] <test.exe>
[1] <*>
C:\>