Отображение команды в консоли cmd - PullRequest
0 голосов
/ 08 февраля 2012

Я пытаюсь запустить команду в cmd, используя C #, и у меня возникли некоторые трудности. Я хотел бы иметь возможность записать команду в консоль cmd, чтобы я мог видеть, что она пытается запустить (я думаю, что есть какая-то проблема с кавычками или чем-то, поэтому, если я смог увидеть фактическую строку в командной строке, я смог бы точно увидеть в чем проблема). Мой код выглядит так:

var processStartInfo  = new ProcessStartInfo("cmd", "/c"+commandString);
processStartInfo.CreateNoWindow = true;
Process.Start(processStartInfo);

В общем, я просто хочу увидеть строку commandString, записанную в консоли. Любая помощь будет принята с благодарностью.

string CommandLineString = @"""C:\Program Files\Microsoft SQL Server\100\Tools\Binn\bcp.exe"" ""SELECT * FROM table where date >= '2009-01-01'"" queryout  ""C:\Data\data.dat"" -S DBSW0323 -d CMS -n -T";

Ответы [ 2 ]

2 голосов
/ 08 февраля 2012

В этом случае проблема, вероятно, заключается только в том, что у вас не хватает пробела после "/c".

var processStartInfo  = new ProcessStartInfo("cmd", "/c " + commandString);

Что касается просмотра в командном окне, то вам, вероятно, будет лучше проверить свойство Arguments вашего экземпляра processStartInfo.

EDIT

Принимая во внимание подробности командной строки, которые вы разместили, я думаю, что это ваша проблема. Проверьте следующее из справки cmd:

Если указано / C или / K, то остаток командной строки после переключатель обрабатывается как командная строка, где следующая логика используется для обработки символов кавычки ("):

  1. Если выполнены все следующие условия, заключите в кавычки символы в командной строке сохраняются:

    • нет / S переключатель
    • ровно две кавычки
    • без специальных символов между двумя кавычками, где специальное - одно из: & <> () @ ^ |
    • между одним или несколькими пробельными символами две кавычки
    • строка между двумя символами кавычек - это имя исполняемого файла.

Поскольку вы используете / c, у вас все еще есть проблемы с цитатами и специальными символами. Попробуйте обернуть все ваши commandString в набор цитат.

Возьмем, к примеру, этот простой пример (конечно, создавая temp.txt вручную):

string commandString = @"""C:\WINDOWS\Notepad.exe"" ""C:\temp.txt""";
var processStartInfo = new ProcessStartInfo("cmd", "/c " + commandString);

Командная строка, которая будет выполнена: /c "C:\WINDOWS\Notepad.exe" "C:\temp.txt", но это не удастся, поскольку "C: \ temp.txt" не является исполняемым файлом.

Если вы заключите все это в один последний набор цитат, вы должны увидеть ожидаемый результат:

string commandString = @"""""C:\WINDOWS\Notepad.exe"" ""C:\temp.txt""""";
var processStartInfo = new ProcessStartInfo("cmd", "/c " + commandString);

В результате в командной строке: /c ""C:\WINDOWS\Notepad.exe" "C:\temp.txt"" и, в конечном итоге, открытие блокнота с тестовым файлом.

0 голосов
/ 08 февраля 2012

Эта строка не «записывается» в консоль, она является частью списка аргументов для программы, которую вы запускаете (в данном случае это cmd.exe).Поскольку созданная консоль принадлежит этой программе, если она не хочет выводить свои аргументы по своим собственным причинам (а это не так), это невозможно сделать напрямую.

Если вы просто хотите отладить, то почему бы не проверитьзначение commandString или записать его в файл журнала?

Если вам абсолютно необходимо, чтобы командная строка отображалась в консоли, вы могли бы прибегнуть к хаки (запустите другую промежуточную программу, которая печатает командуline и затем вызывает cmd.exe вместе с ней), но если нет другой веской причины использовать этот подход, я бы не рекомендовал его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...