2010-03-03 39 views
2

我正在尋找一種將包含「*」字符的字符串通過命令行傳遞給可執行文件的方法。將包含*(星號)字符的字符串作爲Windows Shell中的命令行參數傳遞

command.exe 3*2 

我想傳遞字符串3 * 2。相反,Windows搜索當前目錄中是否存在與文件掩碼「3 * 2」匹配的文件,並將找到的所有文件傳遞給command.exe。

在雙引號之間放置「3 * 2」不起作用,仍然同樣的問題。

我也試過'3 * 2'(單引號之間),但是這個整個字符串(包括單引號)被傳遞,這不是我所需要的。

有沒有任何方法將字符串3 * 2(不帶引號)傳遞給命令?

回答

6

在Windows命令shell中,您執行的命令負責展開參數中存在的任何通配符。這種行爲與Unix和朋友的不同之處在於,通配符擴展通常由shell完成。

一個簡單的例子演示了這一點。

視窗(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 

這裏通配符參數由殼取代以文件的列表/在當前目錄中的目錄。

所以如果你的可執行文件通過擴展來處理通配符,那麼你可以做的事情就不多了。具體行爲取決於你的命令。

如果您提供有關您的命令以及您想要實現的更多詳細信息,我們可能會提供一些幫助。

0

Windows實際上將整個原始命令行作爲單個字符串傳遞給程序;見GetCommandLine。當您編寫main(int argc, char **argv)時,程序鏈接的C運行時庫負責將命令行分割爲argv中的單詞。

所以我們需要更多信息:你的shell是什麼,你如何調用你的命令,以及你使用的是哪個C運行時庫?你看到的問題肯定不是Windows本身,我不能用cmd.exe和MSVC的CRT在這裏重現它。

 
C:>type 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]); 
    return 0; 
} 
^Z 

C:\>cl test.c 
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86 
Copyright (C) Microsoft Corporation. All rights reserved. 

test.c 
Microsoft (R) Incremental Linker Version 9.00.30729.01 
Copyright (C) Microsoft Corporation. All rights reserved. 

/out:test.exe 
test.obj 

C:\>test.exe * 
2 
[0] <test.exe> 
[1] <*> 

C:\> 

如果我使用Cygwin的CRT,並從Cygwin的Bash shell運行,那麼我也沒有看到問題。

 
C:\>C:\cygwin\bin\bash -l 
$ cd /cygdrive/c 
$ cc test.c 
$ ./a.exe '*' 
2 
[0] <./a> 
[1] <*> 
$ 

這只是如果我嘗試將它們混合—運行使用Cygwin的CRT從CMD的程序。EXE —在那裏我可能看到你的問題

 
$ exit 

C:\>a.exe * 
19 
[0] <a> 
[1] <AUTOEXEC.BAT> 
[2] <BOOT.INI> 
[3] <CONFIG.SYS> 
[4] <Documents and Settings> 
[5] <IO.SYS> 
[6] <MSDOS.SYS> 
[7] <NTDETECT.COM> 
[8] <NTLDR> 
[9] <Program Files> 
[10] <RECYCLER> 
[11] <Recycled> 
[12] <System Volume Information> 
[13] <WINDOWS> 
[14] <cygwin> 
[15] <hiberfil.sys> 
[16] <pagefile.sys> 
[17] <temp> 
[18] <a.exe> 

C:\> 

,但我不認爲用雙引號的問題。

 
C:\>a.exe "*" 
2 
[0] <test.exe> 
[1] <*> 

C:\> 
+0

雙引號不要爲我工作 - 但我使用的是Windows 7的CMD與海合會與你的測試程序。你使用的是什麼版本的cmd.exe? – 2015-07-29 03:24:01

+1

好吧,我想通了:它是一個mingw32的事情,請參閱https://www.cygwin.com/ml/cygwin/1999-11/msg00052.html – 2015-07-29 03:42:39

1

你可以嘗試逃跑

command.exe 3^*2 
相關問題