Winform Netsh进程无法接受多个参数

时间:2018-07-16 05:18:01

标签: multithreading winforms user-interface process worker

这是我第一次使用带有多个参数的ProcessStartInfo,而且我精打细算地使我的代码正常工作。我不断收到错误或以下错误的某种版本,具体取决于是否或如何在参数字符串中使用转义。

我尝试了多个stackoverflow代码段,并从MSDN中读取了所有可以读取的内容。
MSDN指示应转义空格。当我这样做时会收到一个错误...如果不对参数进行转义,也会收到一个错误。在textBox1.Text中显示以下错误...

  

[1]:找不到以下命令:“ trace start capture = yes   report = nopersistant = no traceFile = C:\ temp \ mynettrace.etl“。

但是,当我从WinForms Button单击启动它时,它不喜欢我配置参数的方式。
我查阅了显示多个args的MSDN参考,但我一定不会想清楚。
我在做什么错了?

namespace Remote_Site_Tools
{
    public partial class DegradationCaptureForm : Form
    {
        public StringBuilder output = new StringBuilder("");
        public DegradationCaptureForm()
        {
            InitializeComponent();
        }

        private void DegradationCaptureStartButton_Click(object sender, EventArgs e)
        {
            DegradationFunction();
        }

        public void DegradationFunction()
        {
            int lineCount = 0;
            this.textBox1.Text = "";

            Process process = new Process();
            process.StartInfo.FileName = "netsh.exe";
            process.StartInfo.Arguments = "trace start capture=yes report=no persistent=no traceFile=C:\\temp\\mynettrace.etl";
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.RedirectStandardOutput = true;
            process.OutputDataReceived += new DataReceivedEventHandler((sender, e) =>
            {
                // Prepend line numbers to each line of the output.
                if (!String.IsNullOrEmpty(e.Data))
                {
                    lineCount++;
                    output.AppendLine("[" + lineCount + "]: " + e.Data);
                }
            });
            process.Start();

            // Asynchronously read the standard output of the spawned process. 
            // This raises OutputDataReceived events for each line of output.
            process.BeginOutputReadLine();
            process.WaitForExit();

            // Write the output of the stringbuilder to the textbox
            textBox1.Text = output.ToString();
            process.Close();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我看到了这个问题,并且很好奇为什么我们看到了不同的响应-一个无法正常工作的响应,而表明它仍然有效的响应。也许我是受虐狂,但我深究这一点并找到了答案。

NETSH是基于脚本的Shell环境,可在各种上下文中运行。上下文由相关DLL提供,这些DLL在建立每个上下文时加载。在我看来,并非64位NETSH中可用的所有上下文都可以在32位NETSH中使用,因此我在C:\ WINDOWS \ SYSWOW64文件夹中启动了NETSH,然后猜测是什么-“跟踪开始”失败了。当我在C:\ WINDOWS \ SYSTEM32中尝试相同的命令时,它运行良好。

收到此信息后,我启动了一个 32位可执行文件,它触发了NETSH-确实-它从c:\ WINDOWS \ SYSWOW64文件夹中触发-然后显示“ trace启动”失败。当我将可执行文件更改为X64(64位)时,NETSH用尽了C:\ WINDOWS \ SYSTEM32-猜猜是什么-跟踪按预期方式完美启动。

这肯定是我所见过的64位和32位应用程序之间最奇怪的区别之一,但这肯定是答案。您可能会尝试查看您遇到的情况是否有相同的结果。