देर से प्रतिक्रिया लेकिन यह वही है जो मैंने किया। यदि आप अपने कर्ल कमांड को उसी तरह चलाना चाहते हैं जैसे आप उन्हें लिनक्स पर चलाते हैं और आपके पास विंडोज़ 10 है या बाद में ऐसा करते हैं:
public static string ExecuteCurl(string curlCommand, int timeoutInSeconds=60)
{
if (string.IsNullOrEmpty(curlCommand))
return "";
curlCommand = curlCommand.Trim();
if (curlCommand.StartsWith("curl"))
{
curlCommand = curlCommand.Substring("curl".Length).Trim();
}
{
curlCommand = curlCommand.Replace("--compressed", "");
var fullPath = System.IO.Path.Combine(Environment.SystemDirectory, "curl.exe");
if (System.IO.File.Exists(fullPath) == false)
{
if (Debugger.IsAttached) { Debugger.Break(); }
throw new Exception("Windows 10 or higher is required to run this application");
}
List<string> parameters = new List<string>();
try
{
Queue<char> q = new Queue<char>();
foreach (var c in curlCommand.ToCharArray())
{
q.Enqueue(c);
}
StringBuilder currentParameter = new StringBuilder();
void insertParameter()
{
var temp = currentParameter.ToString().Trim();
if (string.IsNullOrEmpty(temp) == false)
{
parameters.Add(temp);
}
currentParameter.Clear();
}
while (true)
{
if (q.Count == 0)
{
insertParameter();
break;
}
char x = q.Dequeue();
if (x == '\'')
{
insertParameter();
while (true)
{
x = q.Dequeue();
if (x == '\\' && q.Count > 0 && q.Peek() == '\'')
{
currentParameter.Append('\'');
q.Dequeue();
continue;
}
if (x == '\'')
{
insertParameter();
break;
}
currentParameter.Append(x);
}
}
else if (x == '"')
{
insertParameter();
while (true)
{
x = q.Dequeue();
if (x == '\\' && q.Count > 0 && q.Peek() == '"')
{
currentParameter.Append('"');
q.Dequeue();
continue;
}
if (x == '"')
{
insertParameter();
break;
}
currentParameter.Append(x);
}
}
else
{
currentParameter.Append(x);
}
}
}
catch
{
if (Debugger.IsAttached) { Debugger.Break(); }
throw new Exception("Invalid curl command");
}
StringBuilder finalCommand = new StringBuilder();
foreach (var p in parameters)
{
if (p.StartsWith("-"))
{
finalCommand.Append(p);
finalCommand.Append(" ");
continue;
}
var temp = p;
if (temp.Contains("\""))
{
temp = temp.Replace("\"", "\\\"");
}
if (temp.Contains("'"))
{
temp = temp.Replace("'", "\\'");
}
finalCommand.Append($"\"{temp}\"");
finalCommand.Append(" ");
}
using (var proc = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "curl.exe",
Arguments = finalCommand.ToString(),
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true,
WorkingDirectory = Environment.SystemDirectory
}
})
{
proc.Start();
proc.WaitForExit(timeoutInSeconds*1000);
return proc.StandardOutput.ReadToEnd();
}
}
}
कोड थोड़ा लंबा है, इसका कारण यह है कि यदि आप किसी एकल उद्धरण को निष्पादित करते हैं तो विंडोज़ आपको एक त्रुटि देगा। दूसरे शब्दों में, कमांड curl 'https://google.com'
लिनक्स पर काम करेगा और यह विंडोज़ पर काम नहीं करेगा। उस विधि के लिए धन्यवाद, मैंने बनाया आप एकल उद्धरणों का उपयोग कर सकते हैं और अपने कर्ल कमांड को ठीक वैसे ही चला सकते हैं जैसे आप उन्हें लिनक्स पर चलाते हैं। यह कोड इस तरह के \'
और भागने के पात्रों के लिए भी जाँच करता है \"
।
उदाहरण के लिए इस कोड का उपयोग करें
var output = ExecuteCurl(@"curl 'https://google.com' -H 'Accept: application/json, text/javascript, */*; q=0.01'");
यदि आप जहां उसी स्ट्रिंग को फिर से चलाना चाहते हैं तो C:\Windows\System32\curl.exe
यह काम नहीं करेगा क्योंकि किसी कारण से विंडोज़ एकल उद्धरण पसंद नहीं करता है।