C# c语言中的StartInfo.Arguments#
我找到了以下代码片段: 使用制度; 使用系统诊断C# c语言中的StartInfo.Arguments#,c#,C#,我找到了以下代码片段: 使用制度; 使用系统诊断 public class RedirectingProcessOutput { public static void Main() { Process p = new Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.Arguments = "/c dir *.cs"; p.StartInfo.UseSh
public class RedirectingProcessOutput
{
public static void Main()
{
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = "/c dir *.cs";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.Start();
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();
Console.WriteLine("Output:");
Console.WriteLine(output);
}
}
但我不知道这是什么p.StartInfo.Arguments=“/c dir*.cs”代码>正在做什么?提前感谢您的解释它将传递给即将启动的流程
在这种特殊情况下,进程是Windows shell(cmd.exe
)。将命令行传递给它将导致它在启动时执行该命令;然后,由于开头的/c
参数,它将自行终止
因此,如果打开命令提示符并输入传递给将启动的进程的命令dir*.cs
,进程的输出将与您得到的完全相同
在这种特殊情况下,进程是Windows shell(cmd.exe
)。将命令行传递给它将导致它在启动时执行该命令;然后,由于开头的/c
参数,它将自行终止
因此,如果打开命令提示符并输入命令dir*.cs
该行仅给出该进程的参数,则进程的输出将与您得到的完全相同 那一行只是给了这个过程一个参数 在开始时,was和它的friends接受指向可执行文件的路径和指向参数的变长指针列表。在sane操作系统中,启动的进程接收到一个指向参数列表的点,参数列表的每个字都包含一个指向的指针和单个字符串。Sane Shell解析命令行并填充exec(3)所需的参数列表
您可以看到exec(3)接受的参数列表之间的直接关联:
以及传递到流程入口点的内容:
int main(char*arg[]){…}
其中,argv[0]
是可执行文件名,argv[1]
-argv[n-2]
是单独的参数,argv[n-1]
是指示参数列表结束的空指针
概念简单,实现简单
CP/M没有这样做(我想是因为内存有限)。它将原始命令行的地址从shell传递给启动的进程,并将其解析留给进程
DOS在1982年作为CP/M的克隆出现,同时将原始命令行的地址交给已启动的进程
Windows从一开始就没有偏离这一模式。Win32CreateProcess()
函数
BOOL WINAPI CreateProcess(
__in_opt LPCTSTR lpApplicationName,
__inout_opt LPTSTR lpCommandLine,
...
);
仍然执行相同的操作,将原始命令行传递给程序。当然,C运行时库会或多或少地为您处理命令行解析
因此…在CLR/.Net世界中,由于所有这些历史,并且由于CLR被设计为依赖于Win32 API,您必须向要启动的进程传递完整的命令行。为什么他们不让你传递一个params字符串[]
,而是让CLR构建命令行,这是微软的开发人员一直关注的问题
构建启动程序所需的命令行很简单。您只需将每个参数连接到一个字符串中,并用一个SP字符分隔参数。轻松点
…直到其中一个参数包含空格或双引号字符(“
)
然后你必须引用一个或所有的参数。这应该很容易,但是由于奇怪的引用规则,有很多边缘条件会让你绊倒
Windows命令行被分解成由空格分隔的单词,可以选择用双引号(“
)引用。部分原因是Windows的路径分隔符错误(\
而不是/
),引用规则是…拜占庭式的。如果您深入研究Windows CRT源代码(该文件类似于{VisualStudioInstallLocation}\VC\CRT\src\stdargv.c),您将找到命令行解析代码。开始时,was及其朋友接受可执行文件的路径和指向参数的变长指针列表。在sane操作系统中,启动的进程接收到一个指向参数列表的点,参数列表的每个字都包含一个指向的指针和单个字符串。Sane Shell解析命令行并填充exec(3)所需的参数列表
您可以看到exec(3)接受的参数列表之间的直接关联:
以及传递到流程入口点的内容:
int main(char*arg[]){…}
其中,argv[0]
是可执行文件名,argv[1]
-argv[n-2]
是单独的参数,argv[n-1]
是指示参数列表结束的空指针
概念简单,实现简单
CP/M没有这样做(我想是因为内存有限)。它将原始命令行的地址从shell传递给启动的进程,并将其解析留给进程
DOS在1982年作为CP/M的克隆出现,同时将原始命令行的地址交给已启动的进程
Windows从一开始就没有偏离这一模式。Win32CreateProcess()
函数
BOOL WINAPI CreateProcess(
__in_opt LPCTSTR lpApplicationName,
__inout_opt LPTSTR lpCommandLine,
...
);
仍然执行相同的操作,将原始命令行传递给程序。当然,C运行时库会或多或少地为您处理命令行解析
因此…在CLR/.Net世界中,由于所有这些历史,并且由于CLR被设计为依赖于Win32 API,您必须向要启动的进程传递完整的命令行。为什么他们不让你传递一个params字符串[]
,而是让CLR构建命令行,这是微软的开发人员一直关注的问题
构建启动程序所需的命令行很简单。您只需将每个参数连接到一个字符串中