在 C# 中将 Process.StartInfo.Arguments 作为自身包含双引号 (") 的字符串传递
Passing Process.StartInfo.Arguments in C# as a string that contains double-quotes (") within itself
我希望通过我的 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);
}
}
我猜你的问题没有明确指出错误。我 运行 你在 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
None 网上提到的解决方案对我来说效果很好,所以我想出了一个逃生计划,而不是解决问题的方法。我将双引号作为一个字符存储在一个变量中,并根据需要将其附加到字符串构建语句中。
我的代码如下所示:
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);
}
}
我希望通过我的 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);
}
}
我猜你的问题没有明确指出错误。我 运行 你在 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
None 网上提到的解决方案对我来说效果很好,所以我想出了一个逃生计划,而不是解决问题的方法。我将双引号作为一个字符存储在一个变量中,并根据需要将其附加到字符串构建语句中。 我的代码如下所示:
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);
}
}