5

「*」文字を含む文字列をコマンドライン経由で実行可能ファイルに渡す方法を探しています。

  command.exe 3*2

文字列 3*2 を渡したい。代わりに Windows が行うことは、現在のディレクトリでファイル マスク "3*2" に一致するファイルを検索し、見つかったファイルを command.exe に渡すことです。

二重引用符の間に「3*2」を入れても解決しませんが、同じ問題が発生します。

'3*2' (一重引用符の間) も試しましたが、この文字列全体 (一重引用符を含む) が渡されましたが、これは必要なものではありません。

文字列 3*2 (引用符なし) をコマンドに渡す方法はありますか?

4

3 に答える 3

6

Windowsコマンドシェルでは、実行するコマンドは、パラメーターに存在するワイルドカードを展開する役割を果たします。この動作は、ワイルドカードの拡張が通常シェルによって行われるUnixやその仲間とは異なります。 

簡単な例でこれを示します。

Windows(Windows 7):

C:\Users\Frank>echo *
*

ご覧のとおり、コマンドはコマンドラインから渡されたとおりにパラメーターを出力します。

Linux(CentOS Linux 5でbash):

> echo *
centos-release-5-0.0.el5.centos.2.i386.rpm centos-release-notes-5.0.0-2.i386.rpm glibc-2.5-12.i386.rpm glibc-common-2.5-12.i386.rpm virtualmin-install.log

ここで、ワイルドカードパラメータはシェルによって現在のディレクトリ内のファイル/ディレクトリのリストに置き換えられます。

したがって、実行可能ファイルがワイルドカード文字を展開して処理する場合、それについてできることはあまりありません。具体的な動作は、コマンドによって異なります。

コマンドと達成したいことについての詳細を提供していただければ、さらにサポートを提供できる可能性があります。

于 2010-03-03T21:13:23.940 に答える
1

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:\>
于 2010-03-03T21:13:53.100 に答える
1

あなたは脱出を試みることができます

command.exe 3^*2
于 2010-03-04T00:13:36.033 に答える