Я искал и экспериментировал все утро с этим, и я в тупике. У меня есть страница aspx, работающая в IIS и вызывающая следующую функцию C#. Я пытаюсь запустить его cmd-файл и вернуть результат из cmd-файла. Я экспериментировал с пятью различными вариантами в коде ниже:Process.Start cmd.exe не будет запускать cmd-файл, который передается как приложение при запуске в IIS
protected String RunMyCmdFileAndGetResponse() {
Process proc = new Process();
proc.StartInfo.FileName = @"c:\Windows\System32\cmd.exe";
// proc.StartInfo.Arguments = @"/c echo hello"; <== 1
// proc.StartInfo.Arguments = @"/c c:\mypath\myfile_badname.cmd"; <== 2
// proc.StartInfo.Arguments = @"/c type c:\mypath\myfile.cmd"; <== 3
proc.StartInfo.Arguments = @"/c c:\mypath\myfile.cmd"; // <== 4
// proc.StartInfo.Arguments = @"/c call c:\mypath\myfile.cmd"; <== 5
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.CreateNoWindow = true;
proc.Start();
string response = proc.StandardOutput.ReadToEnd();
response += proc.StandardError.ReadToEnd();
proc.WaitForExit();
return response;
}
Cmd файл C: \ mypath \ myfile.cmd содержание:
@echo test line 1 > c:\mypath\myfilelog.txt
@echo test line 2
Этот CMD файл работает, как ожидалось, когда выполняются вручную , создавая файл myfilelog.txt и возвращающую тестовую строку 2. При выполнении с кодом C#:
- Вариант 1 работает - возвращает ответ «привет», как ожидалось.
- Вариант 2 не подходит, как ожидается, с указанием myfile_badname.cmd не распознается как действительная команда
- Вариант 3 работает как ожидалось - он возвращает содержимое myfile.cmd в качестве ответа - это подтверждает, что я могу найти и прочитать файл.
- Вариант 4 не работает - как можно ближе к нему, он должен. Он не зависает, но также не возвращает никакого ответа вообще и не выполняет cmd-файл (без создания файла myfilelog.txt).
- Вариант 5 - такие же результаты, как вариант 4.
Примечание - Я также попытался модифицировать myfile.cmd удалить строку 1 (создание файла журнала) и оставить только строку 2 эхо ответа. На всякий случай это проблема с разрешением, создающая файл журнала. Тот же результат.
Любая помощь будет оценена!
Обновлено добавить решение:
Ответ от @MaxOvrdrv заставил меня думать по-другому. Кажется, что существует какое-то ограничение при запуске Process.Start в контексте IIS с помощью UseShellExecute = false - если основным аргументом является исполняемый файл (cmd-файл, файл сценария и т. Д.), Он не запускает его. Я попытался передать SomeExample.cmd в cmd.exe и SomeExample.js в cscript.exe.
Однако ... Мне удалось обмануть его с уровнем косвенности, так что имя исполняемого файла больше не является первым аргументом, и оно отлично работает именно так.
Чтобы запустить CMD файл:
string theResponse = RunMyCmdAndGetResponse(@"c:\somepath\mycmd.cmd");
protected String RunMyCmdAndGetResponse(string cmdPath) {
Process proc = new Process();
proc.StartInfo.FileName = @"c:\Windows\System32\cmd.exe";
proc.StartInfo.Arguments = "/c cmd /c " + cmdPath;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.CreateNoWindow = true;
proc.Start();
proc.WaitForExit();
string response = proc.StandardOutput.ReadToEnd();
response += proc.StandardError.ReadToEnd();
return response;
}
Для запуска файла сценария:
string theResponse = RunMyScriptAndGetResponse(@"c:\somepath\myscript.js");
protected String RunMyScriptAndGetResponse(string scriptPath) {
Process proc = new Process();
proc.StartInfo.FileName = @"c:\Windows\System32\cmd.exe";
proc.StartInfo.Arguments = "/c cscript //nologo " + scriptPath;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.CreateNoWindow = true;
proc.Start();
proc.WaitForExit();
string response = proc.StandardOutput.ReadToEnd();
response += proc.StandardError.ReadToEnd();
return response;
}
вы пробовали это? http://stackoverflow.com/questions/5519328/executing-batch-file-in-c-sharp – MaxOvrdrv
Извините, я только что заметил что-то ... см. мой ответ ниже. – MaxOvrdrv
Да, я посмотрел на эти примеры сегодня утром. Единственное функциональное отличие, которое я вижу между верхним ответом и моим примером выше, это то, что они вызывают WaitForExit перед чтением StandardOutput и StandardError, тогда как я вызывал WaitForExit после. я просто попытался сделать это изменение в моем примере и испытать - не радость! – grumpyhoser