Аргументы process.start ()

когда я делаю следующую команду в dos, она будет работать нормально

ffmpeg -f image2 -i frame%d.jpg -vcodec mpeg4 -b 800k video.avi 

Когда я пытаюсь использовать class процесса в c # без аргументов, он загружает ffmpeg в окне консоли, а затем исчезает, как обычно. Однако, когда я пытаюсь использовать аргумент, как я выше, отформатирован точно так же … он не работает! ffmpeg все еще загружается, однако, поскольку окно консоли закрывается так быстро, я не могу определить, что такое ошибка: /

 Process ffmpeg = new Process(); ffmpeg.StartInfo.FileName = path + "//" + "ffmpeg.exe"; ffmpeg.StartInfo.Arguments = " -f image2 -i frame%d.jpg -vcodec mpeg4 -b 800k video.avi"; ffmpeg.Start(); 

Кто-нибудь знает, почему это? Почему команда работает из dos, а затем не работает с использованием c #, даже если аргументы точно совпадают? Я использовал этот метод раньше для многих вещей и никогда не сталкивался с этим.

Попробуйте полностью определить имена файлов в аргументах – я заметил, что вы указываете путь в части FileName, поэтому возможно, что процесс запускается в другом месте, а затем не находит аргументы и вызывает ошибку.

Если это сработает , то использование свойства WorkDirectory в StartInfo может быть полезным.

Собственно, согласно ссылке

Свойство WorkingDirectory должно быть установлено, если указаны UserName и Password. Если свойство не установлено, рабочим каталогом по умолчанию является% SYSTEMROOT% \ system32.

Не совсем прямой ответ, но я настоятельно рекомендую использовать LINQPad для такого «поискового» программирования на C #.

У меня есть следующий как сохраненный «запрос» в LINQPad:

 var p = new System.Diagnostics.Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.Arguments = "/c echo Foo && echo Bar"; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.UseShellExecute = false; p.StartInfo.CreateNoWindow = true; p.Start(); p.StandardOutput.ReadToEnd().Dump(); 

Не стесняйтесь при необходимости адаптироваться.

Обязательно используйте полные пути, например, не только «video.avi», но и полный путь к этому файлу.

Простым трюком для отладки было бы запустить командное окно, используя cmd /k вместо этого:

 string ffmpegPath = Path.Combine(path, "ffmpeg.exe"); string ffmpegParams = @"-f image2 -i frame%d.jpg -vcodec" + @" mpeg4 -b 800k C:\myFolder\video.avi" Process ffmpeg = new Process(); ffmpeg.StartInfo.FileName = "cmd.exe"; ffmpeg.StartInfo.Arguments = "/k " + ffmpegPath + " " + ffmpegParams ffmpeg.Start(); 

Это оставит окно командной строки открытым, чтобы вы могли легко проверить вывод.

Чтобы лучше диагностировать, вы можете захватить стандартный вывод и стандартные streamи ошибок внешней программы, чтобы узнать, какой результат был сгенерирован, и почему он может работать не так, как ожидалось.

Погляди:

  • ProcessStartInfo.RedirectStandardError и
  • ProcessStartInfo.RedirectStandardOutput .

Если вы установите для каждого из них значение true, вы можете позже вызвать process.StandardOutput.ReadToEnd() и process.StandardError.ReadToEnd() чтобы получить вывод в строковых переменных, которые вы можете легко проверить в отладчике или вывести на трассировку или ваш файл журнала.

Очень крайний случай, но мне пришлось использовать программу, которая работала корректно только тогда, когда я указал

 StartInfo = {..., RedirectStandardOutput = true} 

Не указывая, что это приведет к ошибке. После этого не было необходимости читать результаты.

  • Как я могу запускать и забывать процесс в Perl?
  • Как убить процесс с помощью Vb.NET или C #?
  • Как передать параметры другому процессу в c #
  • Сделать муравей тихий без флага -q?
  • Каков наилучший выбор для межпроцессного взаимодействия .NET?
  • Перенаправление стандартного ввода консольного приложения
  • Как узнать, работает ли процесс?
  • Как подождать в bash для нескольких subprocessов, чтобы закончить и вернуть код выхода! = 0, когда какой-либо subprocess заканчивается кодом! = 0?
  • Найти (и убить) процесс блокировки порта 3000 на Mac
  • Список приложений в процессе
  • Как обрезать расширение файла из String в Java?
  • Давайте будем гением компьютера.