首页 > 解决方案 > 在 C# Process.Start 参数中使用单引号

问题描述

我需要使用包含单引号的参数从 .Net Core 执行 Linux 命令行程序'

两个例子:

dpkg-query -W -f=' ${db:Status-Status} ' mariadb*

virsh qemu-agent-command SRV01 '{"execute":"guest-ping"}' 

在 C# 中:

Process proc = new System.Diagnostics.Process();
ProcessStartInfo pi = new ProcessStartInfo("dpkg-query");
pi.Arguments = "-W -f=' ${db:Status-Status} ' mariadb*";
proc.StartInfo = pi;
proc.Start();

错误消息的一个示例:'''''''''''''''''''dpkg-query: no packages found matching ${db:Status-Status} dpkg-query: no packages found matching '

我正在调用大约 30 个带有参数的不同程序,没有任何问题。只有单引号有问题

还尝试使用ProcessStartInfo.ArgumentList和许多基本的逃生技巧,但没有成功。

标签: c#linux.net-coreprocessparameter-passing

解决方案


解决方案:

using System;
using System.Diagnostics;

namespace Exe
{
    class Program
    {
        static void Main(string[] args)
        {
            Process proc = new System.Diagnostics.Process();

            //In the Linux shell: dpkg-query -W -f=' ${db:Status-Status} ' mariadb*:
            ProcessStartInfo pi = new ProcessStartInfo("dpkg-query");
            pi.ArgumentList.Add("-W");
            pi.ArgumentList.Add("-f= ${db:Status-Status} ");
            pi.ArgumentList.Add("mariadb*");

            pi.UseShellExecute = false;
            proc.StartInfo = pi;
            proc.Start();
            do { System.Threading.Thread.Sleep(50); } while (proc.HasExited == false);
            Environment.Exit(0);
        }
    }
}

还有另一个命令示例:

....
//In the Linux shell: virsh qemu-agent-command SRV04 '{"execute":"guest-ping"}'
ProcessStartInfo pi = new ProcessStartInfo("virsh");
pi.ArgumentList.Add("qemu-agent-command");
pi.ArgumentList.Add("SRV03");
pi.ArgumentList.Add("{\"execute\":\"guest-ping\"}");
....

在TSlivedejnm2的帮助下解决了这个github.com的问题:-)


推荐阅读