Process.Start, командные файлы и цитирование - PullRequest
1 голос
/ 07 апреля 2011

Я написал BAT скрипт, который автоматически подключается и отключается от широкополосного соединения:

netsh mbn connect interface="Mobile Broadband Connection" connmode=name name="My Provider" 
netsh mbn disconnect interface="Mobile Broadband Connection"

Когда я щелкаю скрипт BAT, он работает нормально, но когда я выполняю его с Process.Start:

    var startInfo = new ProcessStartInfo
    {
        FileName = "cmd.exe",
        Arguments = "/c reconnect.bat",
        WindowStyle = ProcessWindowStyle.Minimized,
        UseShellExecute = false,
        RedirectStandardOutput = true,
        RedirectStandardError = true
    };

    var process = new Process
    {
        StartInfo = startInfo
    };
    process.Start();

netsh возвращает ошибку, что команда mbn не была найдена.

Прежде чем использовать файл BAT, я запускал команды напрямую. Они отлично работали на оболочке, но получили ту же ошибку при использовании Process.Start.

Почему это происходит со мной?

Выход:

C: \ Dev \ NetworkAdapterTest \ NetworkAdapterTest \ Bin \ Debug> Netsh Интерфейс mbn connect = \ "Мобильный Breitbandverbindung \ "connmode = name name = \ "A1 2 \" Следующая команда не был найден: mbn connect interface = "Мобильный Breitbandverbindung" connmode = name name = "A1 2".

C: \ Dev \ NetworkAdapterTest \ NetworkAdapterTest \ Bin \ Debug> Netsh MBN отключить интерфейс = \ "Мобильный Breitbandverbindung \ "следующее команда не найдена: mbn отключить interface = "Mobile Breitbandverbindung"

Обратите внимание на то, как на самом деле приведена цитата. У меня возникли те же проблемы, когда я запускал команды напрямую.

Когда я компилирую решение с помощью Visual Studio 2008, все работает как положено.

Вопрос больше не актуален.

Ответы [ 2 ]

2 голосов
/ 07 апреля 2011

Содержание вашей переменной аргументов, кажется, не имеет большого смысла. Если ваша программа находится в «C: \ Temp», это будет: «C: \ Temp \ / c reconnect.bat».
Если файл bat находится в той же папке, что и ваше приложение, вы можете использовать этот код:

var arguments = string.Format("/c \"{0}\"", 
                  Path.Combine(Application.StartupPath, "reconnect.bat"));

Дополнительные кавычки, если в вашем пути есть пробелы.

1 голос
/ 07 апреля 2011

Вместо того, чтобы использовать "cmd.exe", вы пытались запустить пакетный файл напрямую?Это должно работать без необходимости проходить через cmd.exe.

Еще одна вещь, которую я бы проверил, это то, что вы используете правильный путь.Самый простой способ - поместить Bat в тот же каталог, что и ваш исполняемый файл, или обратиться к полному пути в имени файла.

Переполнение стека - как выполнить пакетный файл из формы Windows

...