Процесс передачи.StartInfo.Аргументы в C # в виде строки, которая содержит двойные кавычки («) внутри себя

#c# #shell #command-line #command #command-line-arguments

#c# #оболочка #командная строка #команда #аргументы командной строки

Вопрос:

Я хочу запустить 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);
        }
    }
  

Комментарии:

1. Пожалуйста, пример кода

2. Просто добавила это для вашего удобства @Lana

3. Я не вижу никаких экранированных двойных кавычек в вашей строке аргумента.

4. @Lana если вы отлаживаете код, используя подходящие точки останова, вы увидите, что аргумент, передаваемый в командную строку, выглядит примерно следующим образом: —db MyDatabase—collection MyCollection —type json —query «{_id:{$gte: ObjectId(‘5c9d60000000000000000000’), $lte: ObjectId(‘ 5c9eb180ffffffffffffffffffff’)}}» —вывод myFile.json —JSONArray

5. В watch это будет показывать обратную косую черту, но на самом деле, когда вы отправляете ее в консоль. или файла, обратных косых черт не будет.

Ответ №1:

Я предполагаю, что ваш вопрос не содержит четкого указания ошибки. Я запустил ваш код в Visual Studio и понял проблему.

Проблема в том, что queryFilter переменная содержит много пробелов. Когда вы указываете параметр командной строки, который содержит пробелы, он должен быть заключен в двойные кавычки.

Но вы expstring не помещаете это queryFilter значение в кавычки. Именно по этой причине символы после кавычек рассматриваются как отдельные переключатели, и выполнение команды завершается сбоем.

Вам придется внести небольшое изменение в код, чтобы включить двойные кавычки:

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

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

—БД yourDatabaseName —коллекции —yourCollectionName типа JSON —запроса «{параметр _id:{$GTE-это: аргумент ObjectId(‘5a497a000000000000000000’), $LTE: в поле ObjectId(‘5c54dd80ffffffffffffffff’)}}» —из yourFilePath —jsonArray

Это действительно должно решить вашу проблему.

Проверьте код по адресу: dotnet fiddle

Комментарии:

1. Изменение в коде, о котором вы упомянули выше, было моей самой первой попыткой решить проблему, но это не решает мою проблему в целом. Строка синтаксически сохраняется в C # с использованием этого метода, но обратная косая черта также включена в командную строку как часть аргументов, что вызывает всю ошибку. Я понял об этом во время отладки кода, что мои параметры командной строки действительно поступают в командную строку с помощью escape-обратной косой черты.

Ответ №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);
    }
}