我找到了以下代碼片段:c中的StartInfo.Arguments#
using System; using System.Diagnostics;我不知道p.StartInfo.Arguments = "/c dir *.cs";
在幹什麼?在此先感謝您的任何解釋
我找到了以下代碼片段:c中的StartInfo.Arguments#
using System; using System.Diagnostics;我不知道p.StartInfo.Arguments = "/c dir *.cs";
在幹什麼?在此先感謝您的任何解釋
開頭是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),您會發現命令行解析代碼。
它將command line arguments傳遞給將要啓動的進程。
在這種特殊情況下,該進程是Windows shell(cmd.exe
)。將命令行傳遞給它會導致它在啓動時執行此命令;那麼,由於/c
參數在開始時會自行終止。
因此,如果打開命令提示符並輸入命令dir *.cs
,則過程的輸出將與您將獲得的結果完全相同。
該行僅給出該進程的參數。
這是示例代碼,毫無疑問。但是實際上並沒有使用它,Directory.GetFiles()方法可以做相同的事情,並且開銷少很多。 –