0

Я хочу перебрать все изображения в папке, получить имя каждого изображения и передать аргумент с использованием имени. Это то, что у меня есть:Передайте больше аргументов в уже открытую подсказку cmd в 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 
} 

ответ

1

Есть несколько методов, но обычно проще всего создать пакетный файл со всеми командами, которые вы хотите, чтобы выполнить то, что передать в качестве параметра 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); 
    } 
} 

Таким образом вы также получите имя файла на выходе, чтобы помочь разобрать.


Другой вариант - использовать перенаправление полного потока для потоков, с которых вы можете писать команды и читать ответы. Это позволит вам запускать командную строку где-то в фоновом режиме, для которой вы можете выдавать команды. Кажется простым, но, честно говоря, требуется очень много работы, чтобы все было в порядке. Если вы хотите пойти таким путем, я бы предложил перенаправить все три стандартных потока.

+0

Спасибо! Это работает очень хорошо! Просто быстрый вопрос: почему «@» tesseract «" {0} "" "" "+ outputFile + @" "" ";' вместо более короткого '@" tesseract {0} "+ outputFile;'? Я вижу, что в вашем формате написано много кодов и всегда задавались вопросом, почему. –

+0

Чтобы вы могли использовать пробелы в имени файла, если хотите, для исходных или выходных файлов. – Corey

0

Почему бы не программа создать пакетный файл, содержащий все файлы/команды, которые будут выполняться, а затем использовать Process.Start выполнить командный файл?

0

Вы можете использовать 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); 
Смежные вопросы