Ведение переменных при выполнении cmd из приложения C #

1

Я хочу вызвать команды командной строки cmd из приложения.net С#. Однако перед выполнением команды мне нужно настроить переменные в пакетном файле. Есть ли способ сохранить переменные для последующих вызовов в командной строке?

Ниже приводится пример проблемы.

Скажем, у меня есть простой пакетный файл C:\setEnv.bat, содержащий

set notepad=C:\windows\system32\notepad.exe

Тогда, если у меня есть код С#, например:

var proc1 = new ProcessStartInfo();
string cmd1 = @"CALL C:\setEnv.bat";
string cmd2 = @"ECHO notepad=%notepad%>C:\test.txt";
proc1.UseShellExecute = true;

var process = new Process();
var startInfo = new ProcessStartInfo();
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/C " +cmd1;
process.StartInfo = startInfo;
process.Start();
process.WaitForExit();
startInfo.Arguments = "/C " + cmd2;
process.Start();
process.WaitForExit();

Теперь я предполагаю, что /C завершает командную строку, теряя при этом мои переменные, но если у меня ее нет, то команда cmd не вернется после завершения команды.

Я думал, что могу удвоить cmd1 и cmd2 до одного вызова, но тогда мне нужно будет сделать это для каждого вызова командной строки cmd и немного повторить вызов C:\setenv.bat снова и снова.

  • 1
    Это полностью по замыслу. Процесс обычно наследует среду программы, которая его запускает, любые изменения, которые он вносит в свою среду, теряются при завершении программы. Так что продвигайтесь вперед, изменив вашу среду или используя свойство ProcsesStartInfo.EnvirontmentVariables.
  • 0
    У меня есть стороннее приложение, которое требует, чтобы перед запуском было установлено достаточное количество переменных среды. Я не уверен, какая переменная ему нужна, и я стараюсь избегать «CALL setenv.bat && thirdPartyApp.exe», так как постоянный вызов setenv кажется избыточным. Посмотрим на свойство EnvironmentVariables.
Теги:
cmd

2 ответа

1

Вы можете использовать этот вопрос в этом вопросе

Например, используйте команду "set" в cmd1:

string cmd1 = "\" CALL C:\\setEnv.bat && set \"";
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
//...
process.Start();
string variables = process.StandardOutput.ReadToEnd();
// next parse variables string

И до начала второго процесса заданные анализируемые переменные в "startInfo.EnvironmentVariables"

0

Несколько вопросов/идей:

1) Сколько значений вам нужно отслеживать от одного исполнения к другому? В первую очередь, можете ли вы просто использовать возвращаемое значение errorlevel или вам нужна дополнительная информация?

2) Можно ли перенести результаты первого непосредственно во второй как один вызов?

3) Можете ли вы вывести значения из первого вызова в файл и во 2-й вызов, трубе, который в качестве входного сигнала во второй cmd?

4) Я предполагаю, что у вас есть обработка, которая выполняется после запуска первого cmd, но до вызова 2-го cmd. Не удалось создать файл.exe, который может быть выдан 1-м командным файлом (после другого кода), который выполняет эту обработку. Таким образом, у вас есть 3 cmds, все из которых могут быть запущены в одной и той же среде, и ваши переменные придерживаются.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню