题主没有说太多,因为很难用一行来质疑。我必须执行一些从注册表中读取的程序。我必须从有人保存整个路径和参数的字段中阅读。
我一直在使用System.Diagnostics.ProcessStartInfo设置程序的名称及其参数,但我发现了各种各样的参数,我必须解析这些参数才能将进程可执行文件保存在一个字段中,将其参数保存在另一个字段中。
有没有办法按原样执行整个字符串?
我已经用与上面的海报相同的方式解决了这个问题,使用 cmd.exe 和进程启动信息。
Process myProcess = New Process;
myProcess.StartInfo.FileName = "cmd.exe";
myProcess.StartInfo.Arguments = "/C " + cmd;
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
myProcess.StartInfo.CreateNoWindow = True;
myProcess.Start();
myProcess.WaitForExit();
myProcess.Close();
cmd/c 执行命令,然后终止。如果进程运行时间过长,WaitForExit 将终止进程。
事实上,有几个。
- 你可以调用cmd.exe,使用/C [你的命令行]作为参数。这会导致 cmd.exe 处理您的命令,然后退出。
- 您可以将命令写入批处理文件并启动该文件。
当然,还有你现在正在采取的方法,即解析命令行。
当未设置"UseShellExecute"时,System.Diagnostics.Process 调用 CreateProcess 或 CreateProcessAsUser 来实际启动程序(如果您指定用户/域/密码,它将使用第二个程序)。这两个调用都可以将命令和文件作为单个参数。从 MSDN:
lpApplicationName 参数可以是 零。在这种情况下,模块名称 必须是第一个白色 空格分隔的标记在 lp命令行字符串。 ...
lpApplication name 映射到 ProcessStartInfo.Filename,lpCommandLine 映射到 Arguments。所以你应该去:
var processStartInfo = new ProcessStartInfo()
{
UseShellExecute = false,
Arguments = cmd
};
Process.Start(processStartInfo);