Передача Process.StartInfo.Arguments в C # в виде строки, которая содержит в себе двойные кавычки (") - PullRequest
0 голосов
/ 29 марта 2019

Я хочу запустить процесс mongoexport.exe через мой код C #, для которого, скажем, аргументы выглядят следующим образом:

- запрос "query_syntax"

Весь приведенный выше текст должен храниться в строковой переменной в коде C # и передаваться в качестве обязательного аргумента.

Проблема теперь в том, что C # внутренне хранит такие строки с escape-символом (). Тот же escape-символ даже сохраняется в командной строке, поэтому мой последний аргумент выглядит следующим образом:

- запрос \ "query_syntax \"

Указанный выше escape-символ является причиной сбоя моего кода, и я никак не могу с этим разобраться.

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

Ответы [ 2 ]

3 голосов
/ 29 марта 2019

Полагаю, в вашем вопросе нет четкого указания на ошибку.Я запустил ваш код в 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

0 голосов
/ 12 апреля 2019

Ни одно из решений, упомянутых в интернете, не помогло мне, поэтому я придумал план побега, а не решение проблемы.Я хранил двойные кавычки как символ в переменной и добавлял его к оператору построения строк в соответствии с потребностями.Мой код выглядел следующим образом:

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