Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Winform netsh进程无法接受多个参数_Multithreading_Winforms_User Interface_Process_Worker - Fatal编程技术网

Multithreading Winform netsh进程无法接受多个参数

Multithreading Winform netsh进程无法接受多个参数,multithreading,winforms,user-interface,process,worker,Multithreading,Winforms,User Interface,Process,Worker,这是我第一次使用带有多个参数的ProcessStartInfo,我真是束手无策,想让代码正常工作。根据是否在参数字符串中使用转义或如何使用转义,我会不断收到错误或以下错误的某些版本。 我尝试了多个stackoverflow代码片段,并从MSDN中尽可能地阅读了所有内容。 MSDN表示应该转义空白。当我这样做时,我收到一个错误。。。如果我没有逃避参数,我也会收到一个错误。以下错误显示在textBox1中。Text [1] :未找到以下命令:“跟踪开始捕获=是” report=no persiste

这是我第一次使用带有多个参数的ProcessStartInfo,我真是束手无策,想让代码正常工作。根据是否在参数字符串中使用转义或如何使用转义,我会不断收到错误或以下错误的某些版本。

我尝试了多个stackoverflow代码片段,并从MSDN中尽可能地阅读了所有内容。
MSDN表示应该转义空白。当我这样做时,我收到一个错误。。。如果我没有逃避参数,我也会收到一个错误。以下错误显示在textBox1中。Text

[1] :未找到以下命令:“跟踪开始捕获=是” report=no persistent=no traceFile=C:\temp\mynettrace.etl.“

但是,当我从WinForms按钮启动它时,它不喜欢我配置参数的方式。
我查阅了显示多个参数的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();
        }
    }
}

我看到了这个问题,非常好奇为什么我们会看到不同的反应——一个是它不起作用的反应,另一个是表明它起作用的反应。也许我是一个受虐狂,但我深陷其中,找到了答案

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

有了这些信息,我启动了一个启动NETSH的32位可执行文件,果然,它是从c:\WINDOWS\SYSWOW64文件夹启动的,“跟踪启动”失败了。当我将可执行文件更改为X64(64位)时,NETSH在C:\WINDOWS\SYSTEM32中运行-猜猜看-跟踪启动得很好,正如预期的那样


这肯定是我见过的64位和32位应用程序之间最奇怪的区别之一,但这似乎就是答案。你可以试着看看在你的情况下你是否也经历过同样的结果

我以为你已经解决了。这个代码没有问题。它运行正常。您应该确认
C:\\temp\\mynettrace.etl
文件不存在,否则
netsh
将拒绝覆盖它。另外,在启动另一个具有相同文件名的跟踪之前,请停止跟踪:
netsh->trace->stop
(并删除/移动生成的文件)。否则,
netsh
将拒绝运行。