繁体   English   中英

在C#中将Process.StartInfo.Arguments作为字符串传递,该字符串内部包含双引号(“)

[英]Passing Process.StartInfo.Arguments in C# as a string that contains double-quotes (") within itself

我希望通过我的C#代码运行mongoexport.exe进程,例如,其参数如下:

--query“查询语法”

以上所有文本均应存储在C#代码的字符串变量中,并作为必需的参数传递。

现在的问题是C#在内部用转义字符()存储此类字符串。 相同的转义符甚至保留在命令行中,这使我的最终参数看起来如下所示:

--query \\“ query_syntax \\”

上面的转义字符是我的代码失败的原因,而我找不到任何解决方法。

public static string dateConverter(DateTime dt)
    {
        long decimalNumber = (long)(dt.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
        return (Convert.ToString(decimalNumber, 16));
    }
public static void Main(string[] args)
    {
        try
        {
            CultureInfo provider = CultureInfo.InvariantCulture;
            string instr;
            Console.WriteLine("Enter the start date");
            instr = Console.ReadLine();
            DateTime.TryParseExact(instr, "yyyy/MM/dd", provider, DateTimeStyles.None, out startDate);
            Console.WriteLine("Enter the end date");
            instr = Console.ReadLine();
            DateTime.TryParseExact(instr, "yyyy/MM/dd", provider, DateTimeStyles.None, out endDate);
            queryFilter = "{_id:{$gte: ObjectId('" + dateConverter(startDate) + "0000000000000000'), $lte: ObjectId('" + dateConverter(endDate) + "ffffffffffffffff')}}";
            string expstring = " --db yourDatabaseName --collection yourCollectionName --type json --query " + queryFilter + " --out yourFilePath --jsonArray";
            Process export = new Process();
            export.StartInfo.FileName = ExportEXEPath;
            export.StartInfo.Arguments = expstring;
            export.Start();
        }
        catch (Exception ex)
        {
            Console.WriteLine("[ERROR]: " + ex.Message);
        }
    }

我想您的问题并未明确指出错误。 我在Visual Studio中运行了您的代码,并理解了该问题。

问题是queryFilter变量包含很多空格。 当您指定包含空格的命令行参数时,应将其括在双引号中。

但是您的expstring不会将此queryFilter值放在引号中。 这就是将引号后面的字符视为单独的开关并且命令执行失败的原因。

您将需要进行一些小的代码更改以包含双引号:

var expstring = " --db yourDatabaseName --collection yourCollectionName --type json --query \"" 
           + queryFilter 
           + "\" --out yourFilePath --jsonArray";

我运行了代码,下面是生成的命令行。 输出中没有其他斜杠。

--db yourDatabaseName-集合yourCollectionName-类型json-查询“ {_id:{$ gte:ObjectId('5a497a000000000000000000'),$ lte:ObjectId('5c54dd80ffffffffffffffff')}}”“ --out yourFilePath --jsonArray

这实际上应该可以解决您的问题。

在以下位置检查代码: dotnet小提琴

互联网上提到的所有解决方案都不适合我,因此我想出了逃生计划,而不是解决问题的办法。 我将双引号作为字符存储在变量中,并根据需要将其附加到字符串构建语句中。 然后,我的代码如下所示:

public static string dateConverter(DateTime dt)
{
    long decimalNumber = (long)(dt.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
    return (Convert.ToString(decimalNumber, 16));
}
public static void Main(string[] args)
{
    try
    {
        CultureInfo provider = CultureInfo.InvariantCulture;
        string instr;

        char ch = '"'; //added statement

        Console.WriteLine("Enter the start date");
        instr = Console.ReadLine();
        DateTime.TryParseExact(instr, "yyyy/MM/dd", provider, DateTimeStyles.None, out startDate);
        Console.WriteLine("Enter the end date");
        instr = Console.ReadLine();
        DateTime.TryParseExact(instr, "yyyy/MM/dd", provider, DateTimeStyles.None, out endDate);
        queryFilter = "{_id:{$gte: ObjectId('" + dateConverter(startDate) + "0000000000000000'), $lte: ObjectId('" + dateConverter(endDate) + "ffffffffffffffff')}}";

        //reframed statement
        string expstring = " --db yourDatabaseName --collection yourCollectionName --type json --query " + ch + queryFilter + ch + " --out yourFilePath --jsonArray";

        Process export = new Process();
        export.StartInfo.FileName = ExportEXEPath;
        export.StartInfo.Arguments = expstring;
        export.Start();
    }
    catch (Exception ex)
    {
        Console.WriteLine("[ERROR]: " + ex.Message);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM