2014-12-14 2 views
0

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

«Run Command Prompt Commands» обрабатывает выполнение команд с помощью cmd.exe, а «Process.start: how to get the output?» выполняет поиск результата.

Есть одна проблема, с которой мне еще предстоит обратиться. Этот метод выполнения команд через cmd.exe заставляет процесс запускать, делать все, что он должен делать, а затем завершать. Поэтому, если я делаю что-то вроде cd.., ожидаемое изменение состояния не сохраняется между последующими командами, и вы увидите, что вы остаетесь в том же рабочем каталоге.

Возможно ли выполнение команд оболочки при сохранении постоянного сеанса cmd.exe?

+0

Я думаю, что ваше замешательство происходит из-за того, что есть внешние команды, которые smd.exe может запускать, но есть и внутренние команды, которые cmd.exe интерпретирует, не передавая их в Windows. Такие команды, как 'cd' и' set'. Вы должны обрабатывать их внутренне. – itsme86

+0

@ itsme86 Да, точно - как это делается? – Gigi

+0

Ссылка @ Ответ MartinLiversage. – itsme86

ответ

2

Не используйте /c для выполнения команд вообще. Оставьте cmd.exe, чтобы открыть все время и перенаправить свой stdin так же, как вы перенаправляете stdout, а затем кормите команды при необходимости.

var proc = new Process { 
    StartInfo = new ProcessStartInfo { 
     FileName = "cmd.exe", 
     UseShellExecute = false, 
     RedirectStandardError = true, 
     RedirectStandardOutput = true, 
     RedirectStandardInput = true, 
     CreateNoWindow = true 
    } 
}; 

proc.StdIn.WriteLine("cd .."); 
// other commands from the user 

В качестве бонуса это обрабатывает все виды состояния в порожденном процессе; такие как %ERRORCODE%, установка переменных, изменение подсказки и даже запуск вложенных интерпретаторов.

0

Каждый процесс в Windows, включая оболочки, такие как CMD.EXE, имеет текущий каталог. Вы можете изменить текущий каталог в .NET с помощью Directory.SetCurrentDirectory. Выполнение cd .. в командной строке не запускает новый процесс cd. Вместо этого CMD.EXE напрямую обрабатывает команду cd и изменяет текущий каталог командного процессора с помощью Windows API. Вам нужно будет сделать что-то подобное в вашем командном процессоре.

Смежные вопросы