multithreading - 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();
}
}
}
解决方案
我看到了这个问题,并且很好奇为什么我们会看到不同的响应——其中一个不起作用,而响应表明它按原样起作用。也许我是一个受虐狂,但我潜入这个并找到了答案。
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 位应用程序之间最奇怪的区别之一,但这似乎是答案。您可能会尝试查看在您的情况下是否会遇到相同的结果。
推荐阅读
- ruby-on-rails - 我们可以将正则表达式字符串放入环境变量中吗?
- c# - Visual Studio 中的错误,大括号不匹配
- windows - 如何使用 C++ 在 Windows 中的文件夹中获取右键单击项目的名称
- css - 当图案尺寸较小时,背景图像重复图案会显示副作用
- html - 如何在 Tailwind CSS 中使用具有任意值的类
- typescript - 为什么在 nestjs 服务提供者中注入健全的客户端会导致“TypeError:client_1.default 不是函数”?
- python - Django:聚合,强制平均返回整数而不是小数
- html - 如何确定具有相同选择器的元素的 css 特异性?
- python-3.x - 将文件夹移动到自身:shutil,检查文件的路径是否与目标路径相同,如果是,则不执行任何操作
- java - 为什么我在 Java Spring 的存储库接口中的 SQL 中出现 SQL 错误:1064