首页 > 解决方案 > Winform netsh 进程无法接受多个参数

问题描述

这是我第一次将 ProcessStartInfo 与多个参数一起使用,我不知道如何让我的代码正常工作。我不断收到错误或以下错误的某些版本,具体取决于我是否或如何在参数字符串中使用转义。

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

[1]:未找到以下命令:“trace start capture=yes report=no persistent=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();
        }
    }
}

标签: multithreadingwinformsuser-interfaceprocessworker

解决方案


我看到了这个问题,并且很好奇为什么我们会看到不同的响应——其中一个不起作用,而响应表明它按原样起作用。也许我是一个受虐狂,但我潜入这个并找到了答案。

NETSH 是一个基于脚本的 shell 环境,可在各种上下文中运行。上下文由在建立每个上下文时加载的相关 DLL 提供。我突然想到,并非所有在 64 位 NETSH 中可用的上下文都在 32 位 NETSH 中可用,所以我在 C:\WINDOWS\SYSWOW64 文件夹中启动了 NETSH,你猜怎么着——“跟踪启动”失败了。当我在 C:\WINDOWS\SYSTEM32 中尝试相同的命令时,它运行良好。

有了这些信息,我启动了一个32 位可执行文件来触发 NETSH - 果然 - 事实证明它从 c:\WINDOWS\SYSWOW64 文件夹触发 - 并且“跟踪启动”失败。当我将可执行文件更改为 X64(64 位)时,NETSH 然后用完了 C:\WINDOWS\SYSTEM32 - 你猜怎么着 - 正如预期的那样,跟踪完美地开始了。

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


推荐阅读