возникли проблемы с выполнением cmd или командного файла из С#

мне нужно запустить пакетный файл (или cmd) из С#. мой код такой простой:

 Process.Start(@"C:\b.bat");
Process.Start(@"cmd.exe");

Я также пробовал Выполнение пакетного файла на C# и многие другие сайты, но я не думайте, что проблема связана с синтаксисом.

ошибка возникает для любой строки выше, которую я гуглил, но не нашел решения для моей конкретной проблемы:

В System.dll произошло необработанное исключение типа «System.ComponentModel.Win32Exception». Дополнительная информация. Указанный исполняемый файл не является допустимым приложением для этой платформы ОС.

странно то, что эти коды будут работать без проблем:

Process.Start(@"IExplore.exe");
Process.Start("notepad");

Я запускаю Visual Studio 2012 и компилирую для x86, но моя ОС - 64-битная Windows 7, не уверен, что это имеет значение. Все остальное в программе работает нормально.

любая помощь будет принята с благодарностью!


person 1ak31sha    schedule 07.06.2013    source источник


Ответы (3)


Я думаю, ваша проблема в том, что вы пытаетесь запустить неизвестный процесс в Process.Start(@"C:\b.bat"). Когда я делаю это, я использую следующее.

        string cmd = "/C b.bat";
        var m_command = new System.Diagnostics.Process();
        m_command.StartInfo.FileName = @"cmd.exe";
        m_command.StartInfo.Arguments = cmd;
        m_command.Start();

/C закроет приложение после его завершения. Таким образом, приведенный выше код будет:

  1. Запустите процесс cmd.exe
  2. Выполните свои аргументы (в данном случае /C b.bat)
  3. Вы также можете добавить m_command.WaitForExit(), если хотите, чтобы программа дождалась завершения выполнения b.bat, прежде чем продолжить.
person Evan L    schedule 07.06.2013
comment
Спасибо за ответ!! Я запустил ваш код, но он не сработал. также обратите внимание, что мне не требуется запускать cmd и летучую мышь, из того, что я прочитал, я должен иметь возможность просто выполнить летучую мышь - person 1ak31sha; 08.06.2013
comment
Ничего страшного, получилось? Если это так, пожалуйста, отметьте это как ответ, нажав на галочку под кнопками «за»/«против». - person Evan L; 08.06.2013
comment
Ну, в таком случае похоже, что пакетный файл, который вы пытаетесь выполнить, недействителен. Возможно, повторно опубликовать строки в пакетном файле? Что произойдет, если вы запустите пакетный файл непосредственно из командной строки? Он выполняется? Это дает вам ту же ошибку? - person Evan L; 08.06.2013
comment
WaitForExit() определенно будет полезен... но все та же ошибка. - person 1ak31sha; 08.06.2013
comment
пакетный файл должен быть в порядке, я могу щелкнуть по нему, и он делает то, что я хочу. я даже не могу открыть пустой cmd ... я думаю, что если мы решим эту проблему, пакет также будет работать нормально - person 1ak31sha; 08.06.2013
comment
Хорошо, тогда я вполне уверен, что это потому, что вы выполняете его в 32-битном режиме на 64-битной машине. Не моя область знаний, но, возможно, попробуйте сузить круг, скомпилировав 64-битную версию. Если это работает, то это связано с платформой. Также убедитесь, что настройки вашей платформы верны в диспетчере конфигурации. т.е. установите x86, а не любой компьютер. - person Evan L; 08.06.2013
comment
Проверьте Этот пост вроде связан. - person Evan L; 08.06.2013
comment
я должен скомпилировать x86, потому что это приложение предназначено для других компьютеров с x86, а также я запускаю SQL-запросы, а драйверы зависят от x86. Также есть кое-что, что сводит меня с ума - я почти уверен, что запустил команду сегодня утром, и она сработала нормально... должен быть способ открыть cmd... - person 1ak31sha; 08.06.2013
comment
хорошо, поэтому я скомпилировал в x64 и открыл cmd. но мне нужен x86. Я не уверен, что делать банкомат. Я ищу способ запустить x86 cmd... - person 1ak31sha; 08.06.2013
comment
Если вы запустили программу с 32-битной машины (сборка релиза), она будет работать с сборкой x86. Итак, если никто из пользователей не будет запускать его с 64-битных машин, не беспокойтесь об этом и соберите x86. - person Evan L; 08.06.2013
comment
Я попытался установить свойства пакетного файла в режим совместимости для Windows 98, но это не сработало. хотя будут некоторые 64-битные пользователи (включая меня - будет сложно сделать мое приложение, не имея возможности его протестировать...) - person 1ak31sha; 08.06.2013
comment
я собираюсь использовать perl-скрипт для запуска пакета - похоже, эта проблема решается. большое спасибо, что помогли мне, хотя! Вы изолировали проблему :) - person 1ak31sha; 08.06.2013
comment
@ user2464951: не могли бы вы попробовать вручную запустить C:\Windows\SysWOW64\cmd.exe? Это 32-битный cmd.exe, который запустит 32-битное приложение на x64. Похоже, этот файл может быть поврежден в вашей системе. В качестве альтернативы может случиться так, что другой файл с именем cmd.exe был найден перед реальным файлом в PATH для 32-битных приложений, и этот файл поврежден. - person Sven; 08.06.2013

Process.Start(@"C:\b.bat"); должен работать, но проблема может быть связана с его размещением в корневом каталоге. Попробуйте переместить bat-файл в каталог вашего проекта и указать абсолютный путь к файлу. Например, я только что добился успеха с Process.Start(@"""C:\dev\ConsoleApplication1\ConsoleApplication1\test.bat""");

person sfuqua    schedule 08.06.2013

Я решил проблему, запустив 32-битный cmd с помощью этой команды:

proc.StartInfo.FileName = @"C:\windows\system32\cmd.exe";

person 1ak31sha    schedule 12.06.2013