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