2011-09-16 21 views
0

我找到了以下代碼片段:c中的StartInfo.Arguments#

using System; using System.Diagnostics;我不知道p.StartInfo.Arguments = "/c dir *.cs";在幹什麼?在此先感謝您的任何解釋

+1

這是示例代碼,毫無疑問。但是實際上並沒有使用它,Directory.GetFiles()方法可以做相同的事情,並且開銷少很多。 –

回答

1

開頭是exec(3)及其朋友,它們接受可執行文件的路徑以及指向參數的可變長度指針列表。在理智的操作系統中,開始的過程接收到參數列表的一個點,其中的每個單詞包含指向單個字符串的指針。 Sane shell解析命令行並填充exec(3)所需的參數列表。

你可以看到EXEC(3)接受參數列表之間有直接的關係:

exec ("some.executable.file", "arg1" , "arg2" , "arg3" , ...) ; 

,什麼被傳遞給該過程的入口點:

INT主(字符* ARG [ ]){...}

其中argv[0]是可執行文件的名稱,並且argv[1]argv[n-2]是單個參數,並且argv[n-1]是一個NULL指針以指示參數列表的結尾。

這兩者在概念上都簡單易行。

CP/M沒有這樣做(我假設因爲內存有限)。它將已啓動的進程從shell中傳遞給原始命令行的地址,並將其解析爲進程。

DOS隨後在1982年作爲CP/M的克隆,同時將啓動的進程交給原始命令行的地址。

自從成立以來,Windows並沒有偏離該模式。在Win32 CreateProcess()功能

BOOL WINAPI CreateProcess(
    __in_opt  LPCTSTR lpApplicationName, 
    __inout_opt LPTSTR lpCommandLine, 
    ... 
); 

還是做同樣的事情,通過原始命令行要傳遞給程序。當然,C運行時庫會爲您處理命令行解析......或多或少。

因此......在CLR/.Net世界中,由於所有這些歷史,並且由於CLR被設計爲依賴於Win32 API,因此您必須將完整的命令行傳遞給要啓動的進程。爲什麼他們不讓你通過params string[],而是讓CLR構建命令行是微軟開發人員密切關注的問題。

構建啓動程序所需的命令行很簡單。您只需將每個參數連接到一個具有SP字符的單個字符串中,以分隔參數。簡單!

...直到其中一個參數包含空格或雙引號字符(")。

然後你必須引用一個或所有的參數。應該很容易,但由於奇怪的報價規則,有很多邊緣條件可能會讓你感覺不舒服。

Windows命令行分解爲由空白分隔的單詞,可選用雙引號(")引用。部分原因是因爲Windows也得到了路徑分隔符錯誤(\而不是/),引用規則是...拜占庭式的。如果您深入瞭解Windows CRT源代碼(該文件類似於{VisualStudioInstallLocation} \ VC \ crt \ src \ stdargv.c),您會發現命令行解析代碼。

2

它將command line arguments傳遞給將要啓動的進程。

在這種特殊情況下,該進程是Windows shell(cmd.exe)。將命令行傳遞給它會導致它在啓動時執行此命令;那麼,由於/c參數在開始時會自行終止。

因此,如果打開命令提示符並輸入命令dir *.cs,則過程的輸出將與您將獲得的結果完全相同。

0

該行僅給出該進程的參數。