簡體   English   中英

將更多參數傳遞給C#中已經打開的cmd提示符

[英]Pass more arguments to an already opened cmd prompt in C#

我想遍歷文件夾中的所有圖像,檢索每個圖像的名稱並使用名稱傳遞一個參數。 這就是我所擁有的:

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.Start執行該批處理文件?

您可以使用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM