【问题标题】:Passing Process.StartInfo.Arguments in C# as a string that contains double-quotes (") within itself在 C# 中将 Process.StartInfo.Arguments 作为包含双引号 (") 的字符串传递
【发布时间】:2019-08-20 06:08:41
【问题描述】:

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

--查询“query_syntax”

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

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

--查询\"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);
        }
    }

【问题讨论】:

  • 请提供代码示例
  • 为了您的方便添加它@Lana
  • 我在您的参数字符串中看不到任何转义的双引号。
  • @Lana 如果您使用合适的断点调试代码,您将看到传递给命令提示符的参数如下: --db myDatabase--collection myCollection --type json --query \"{_id:{$gte: ObjectId('5c9d60000000000000000000'), $lte: ObjectId('5c9eb180ffffffffffffffff')}}\" --out myFile.json --jsonArray
  • 在手表中它会显示反斜杠,但实际上当你发出它时控制台。或文件,将没有反斜杠。

标签: c# shell command-line command command-line-arguments


【解决方案1】:

我猜你的问题没有明确指出错误。我在 Visual Studio 中运行了您的代码并理解了问题所在。

问题是queryFilter 变量包含很多空格。当您指定包含空格的命令行参数时,它应该用双引号引起来。

但是您的expstring 没有将这个queryFilter 值放在引号内。这就是引号后的字符被视为单独的开关并且命令执行失败的原因。

您必须对代码进行一些小改动以包含双引号:

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

我运行了代码,下面是生成的命令行。输出中没有额外的斜线。

--db yourDatabaseName --collection yourCollectionName --type json --query "{_id:{$gte: ObjectId('5a497a000000000000000000'), $lte: ObjectId('5c54dd80ffffffffffffffff')}}" --out yourFilePath - -jsonArray

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

查看代码:dotnet fiddle

【讨论】:

  • 您上面提到的代码更改是我解决问题的第一次尝试,但它并没有从整体上解决我的问题。字符串在 C# 中使用此方法在语法上正确存储,但反斜杠也作为参数的一部分包含在命令提示符中,这会导致整个错误。我在调试代码时意识到这一点,我的命令行参数确实被接收到带有转义反斜杠的命令提示符中。
【解决方案2】:

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

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);
    }
}

【讨论】:

    猜你喜欢
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 2012-11-21
    • 2017-08-21
    • 2020-03-17
    • 1970-01-01
    相关资源
    最近更新 更多