向c#中已经打开的cmd提示符传递更多参数
本文关键字:提示符 参数 cmd | 更新日期: 2023-09-27 18:19:09
我想循环遍历文件夹中的所有图像,检索每个图像的名称并使用该名称传递参数。这是我的文件:
foreach (string imageFile in Directory.EnumerateFiles(filePath))
{
//Get image name and save it as string
string args = "something"; //a line of argument with image name in it
Process.Start("cmd", @"/c cd C:'Tesseract-OCR && " + args);
}
上面代码的问题是,对于每个图像文件,它将打开一个新的命令提示符。相反,我想要这样写:
Process.Start("cmd", @"/k cd C:'Tesseract-OCR");
foreach (string imageFile in Directory.EnumerateFiles(filePath))
{
//For each imageFile I have, pass an argument to the opened cmd prompt
}
有一些方法,但通常最简单的是创建一个批处理文件,其中包含您想要执行的所有命令,然后将其作为参数传递给cmd
。
像这样:
string imageFolder = @"C:'Path'To'Images";
string batchFile = @"C:'Temp'cmds.cmd";
string outputFile = @"C:'Temp'cmds.log";
// substitute your own command here. "{0}" will be substituted for filename
string command = @"attrib ""{0}"" >> """ + outputFile + @"""";
// delete the batch file if it exists
if (File.Exists(batchFile))
File.Delete(batchFile);
// create batch file from content of image folder
using (var writer = File.CreateText(batchFile))
{
writer.WriteLine("@echo off");
foreach (var file in Directory.EnumerateFiles(imageFolder, "*.jpg"))
writer.WriteLine(command, file);
}
// Delete the output file if it exists
if (File.Exists(outputFile))
File.Delete(outputFile);
// Execute the batch
var p = Process.Start("cmd", @"/c """ + batchFile + @"""");
p.WaitForExit();
完成后,您可以获取输出文件的内容并对其进行解析以获得结果。如果您需要在输出之间休息,只需在每个输出之间回声一些独特的内容。比如:
// create batch file from content of image folder
using (var writer = File.CreateText(batchFile))
{
writer.WriteLine("@echo off");
foreach (var file in Directory.EnumerateFiles(imageFolder, "*.jpg"))
{
writer.WriteLine(@"echo -----Start: {0}>>""{1}""", file, outputFile);
writer.WriteLine(command, file);
writer.WriteLine(@"echo -----End: {0}>>""{1}""", file, outputFile);
}
}
这样,您也可以在输出中获得文件名,以帮助解析。
另一个选项是使用全流重定向到流,您可以向其写入命令并从中读取响应。这将允许您在后台某处运行命令提示符,您可以向其发出命令。看起来很简单,但说实话,要做到恰到好处需要很多努力。如果你想这样做,我建议重定向所有三个标准流。
为什么不让程序创建一个包含所有要执行的文件/命令的批处理文件,然后使用Process。开始执行批处理文件?
您可以使用directory. getfiles()来获取目录中所有文件的字符串数组。然后使用string . join()将数组合并成一个由空格分隔的文件名长字符串。如果你的路径或文件中包含空格,我也会把每一项用引号括起来。
const string QUOTE = "'"";
const string SPACE = " ";
const string SEPARATOR = QUOTE + SPACE + QUOTE;
string[] files = Directory.GetFiles(filePath, "*.png");
string allFiles = QUOTE + String.Join(SEPARATOR, files) + QUOTE;
Console.WriteLine(@"cmd.exe /c cd C:'Tesseract-OCR && " + allFiles);