Запустить команду DOS с параметрами на C#

Если я запускаю эту команду в командном окне, она работает нормально, давая ожидаемые результаты. Я сначала захожу в Путь файла через CD FilePath. Затем запустите команду с флагом и отправьте вывод в DestPath.

C:\Program Files (x86)\ProgramName\FileName.exe -f > C:\Temp\Test.txt

Но он не выполняется через процесс ниже. Я просмотрел множество форумов и пробовал решения, но ни одно из них не помогло.

public const string FilePath = @"C:\\Program Files (x86)\\ProgramName\\FileName.exe";
public const string DestPath = @"C:\\Temp\\Test.txt";

public static void GetResults()
{
    ProcessStartInfo process = new ProcessStartInfo
        {
            UseShellExecute = true,
            CreateNoWindow = false,
            FileName = @"cmd",
        };

    string Command = @"/c " + FilePath + " -f > " + DestPath;
    process.Arguments = Command;
    process.WindowStyle = ProcessWindowStyle.Hidden;
    Process.Start(process);
    Thread.Sleep(2000);

Есть предложения, как исправить эту проблему или что я делаю неправильно?

Ваши пути могут содержать пробелы (в приведенном выше примере кода FilePath уже содержит). Таким образом, убедитесь, что пути в командной строке заключены в кавычки, иначе аргументы командной строки, которые вы передаете в cmd.exe, развалятся (из-за того, что аргумент пути не заключен в кавычки, содержащий пробелы). (Примечание: почему вы избегаете обратной косой черты, когда используете дословные строковые литералы @"....."?)

user2819245 20.12.2018 19:21

введите полный путь к месту, где находится cmd.exe: FileName = @ "cmd",

jdweng 20.12.2018 19:23

Подсказка: чтобы упростить устранение неполадок, сначала попробуйте запустить / имитировать вызов cmd.exe с теми же аргументами, что и в строке Command вашего кода в консоли. (Например, введите в консоли: cmd /c ... с последующим содержанием командной строки)

user2819245 20.12.2018 19:28

Это наша внутренняя разработанная программа, недоступная снаружи. Я искал больше и нашел эту страницу. «community.spiceworks.com/topic/…». Это именно то, что мне нужно. Но когда я бегу таким образом, он говорит, что «C: \ Program» не является внутренней программой. Думаю, он не может разобрать полный путь. Я хочу перейти к: cd C: \ Program Files (x86) \ ProgramPath Затем запустите команду, чтобы получить результаты в C: \ Temp \ Test.txt: \ retrieve -f> C: \ Temp \ Test.txt

Dev 21.12.2018 06:47

Вот код, который работает, но не выводится в файл ... ____________ ProcessStartInfo Process = new ProcessStartInfo {UseShellExecute = false, CreateNoWindow = false, FileName = @ "C: \ Program Files (x86) \ ProgramName \ Command.exe",} ; строка RunCommand = @ "/ c C: \ Program Files (x86) \ ProgramName \ Command.exe -f> C: \ Temp \ Test.txt"; Process.Arguments = RunCommand; Process.Start (Процесс); Console.WriteLine (RunCommand); Console.ReadLine ();

Dev 21.12.2018 07:12

Я вижу вывод в консоли: / c C: \ Program Files (x86) \ ProgramName \ Command.exe -f> C: \ Temp \ Test.txt Результаты: Строка 1 Строка 2 Строка 3 Строка 4

Dev 21.12.2018 07:13

Привет! Я отредактировал ваш вопрос, чтобы, надеюсь, сделать его более читабельным и дать вам лучший ответ. Удачи!

Jeremy Harris 22.12.2018 21:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
205
1

Ответы 1

Итак, в конечном итоге я считаю, что ваша проблема заключается в попытке запустить командную строку и заставить ее выполнить перенаправление вывода. Честно говоря, я не уверен, что это поддерживается, и это не вопрос C#. Если вы действительно действительно хотите сделать это таким образом, я рекомендую написать небольшой командный файл (или, возможно, сценарий PowerShell), который делает то, что вы хотите, и принимает нужные вам параметры ... возможно, только имя выходного файла, а затем запускать его напрямую.

Тем не менее, позвольте мне порекомендовать вам вместо этого использовать перенаправление вывода, встроенное в класс процесса:

https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.processstartinfo.redirectstandardoutput?view=netframework-4.7.2

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

и все. Спасибо за вклад. Я понял с помощью приведенного ниже процесса, и он работает так, как мне нужно. Единственная проблема в том, что, хотя я описал это как «CreateNoWindows = True», окно консоли все еще мигает.

Dev 21.12.2018 18:57

общедоступная константная строка output = "C: \ Temp \ Test.txt"; Процесс p = новый процесс (); p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; p = Process.Start (процесс); p.StandardInput.WriteLine (@ "cd" + FilePath); p.StandardInput.WriteLine (@ "Retrieve -f>" + output); p.StandardInput.WriteLine (@ "ВЫХОД"); строка output = p.StandardOutput.ReadToEnd (); строка error = p.StandardError.ReadToEnd ();

Dev 21.12.2018 18:59

Есть ли какое-то решение с указанным выше фиксированным кодом, чтобы не перепрошивать консоль? Если я устанавливаю «UseShellExecute = True», это дает ошибку, поскольку «RedirectStandardOutput» требует UseShellExecute как False. Я как бы застрял в этой части здесь без решений.

Dev 23.12.2018 16:36

Другие вопросы по теме

Похожие вопросы

Вызов метода пользовательского управления один раз с несколькими экземплярами пользовательского элемента управления на одной странице
Как добавить дополнительные утверждения к токену удостоверения в ADFS с помощью библиотек ADAL?
Асинхронное получение полей путем отражения
Как получить тип класса с помощью GetType
Как создать «встроенный оператор if» с выражениями в динамическом выборе для проверки нуля
Изменения в ItemsSource ItemsControl не обновляются в пользовательском интерфейсе при изменении вкладки в TabControl
Я хотел бы использовать переменную условия, чтобы знать, когда очередь сообщений не пуста, я хотел бы использовать ее в «HandleMessageQueue» в качестве потока
Принудительное использование типов данных при преобразовании xml в json
Как запускать последующие анимации только после завершения предыдущей анимации в Unity?
Исправлено зависание при локализации, но необходимо удалить фокус и вернуть его в форму