2010-05-04 2 views
0

У меня есть приложение Windows, взаимодействующее с базой данных DB2. В моем приложении у меня есть код для выполнения некоторых команд DB2 через интерфейс командной строки. Я использовал windowAPI «ShellExecuteEx()» для выполнения этих команд DB2 через командную строку."|" оператор pipe не работает в командной строке в C++

Ниже приведен код, написанный для выполнения команды DB2 через командную строку.

string command = "/c /w /i DB2 UNCATALOG NODE DB_DATABASE ">>" test.log | echo 
    %date% %time% >> test.log"; 
    SHELLEXECUTEINFO shellInfo; 
    ZeroMemory(&shellInfo, sizeof(shellInfo)); 
    shellInfo.cbSize = sizeof(shellInfo); 
    shellInfo.fMask = SEE_MASK_FLAG_NO_UI | SEE_MASK_NOCLOSEPROCESS; 
    shellInfo.lpFile = "db2cmd"; 
    shellInfo.lpParameters = command.c_str(); 
    if (ShellExecuteEx(&shellInfo)) 
    { 
     WaitForSingleObject(shellInfo.hProcess, INFINITE); 
     CloseHandle(shellInfo.hProcess); 
     bStatus = true; 
    } 
    else 
    { 
      bStatus = false; 
    } 

код выполняется успешно, однако если test.log является observered я только получить результат команды DB2, а не дата и время. Если вы видите указанную выше команду, есть «|» оператор трубы и команда echo для регистрации даты и времени в test.log

Обратите внимание, что если я выполню над командой DB2 через отдельную командную строку, то есть не через код. Я могу просмотреть журнал даты и времени вместе с результатом команды DB2 в test.log. Ниже приведена полная команда, которую я выполнил через командную строку. DB2CMD/c/i/w DB2 UNCATALOG NODE DB_DATABASE ">>" test.log | echo% date%% time% >> test.log

По словам меня, поскольку команда DB2 успешно выполнена с помощью кода, существует проблема с использованием только «|» оператор трубы или команда эха.

ответ

0

Оператор трубы выполнен командной оболочкой. Самый простой способ получить эту функциональность - использовать библиотечную функцию system().

В противном случае, вы можете добавить программно метку к файлу после того, как команда будет сделана (в новой редакции):

system ("db2cmd DB2 UNCATALOG NODE DB_DATABASE >>test.log"); 
system ("echo %date% %time% >> test.log"); 
+0

Спасибо за ваши комментарии и предлагая новый подход. Однако, если вы видите код тщательно. Командная команда - «db2cmd», а аргумент передан ей: «/ c/w/i DB2 UNCATALOG NODE DB_DATABASE» >> «test.log | echo% date%% time% >> test.log»; Так что, пожалуйста, также предлагайте, как мы можем сделать то же самое с использованием системной библиотеки, и было бы здорово, если бы вы могли предложить, в чем проблема, которую я получаю при использовании «|» оператор трубы и эхо. Спасибо – decisive

+0

Я ожидал найти что-то вроде db2cmd, но не видел. Я исправил этот пример. – wallyk

+0

Спасибо за предложение такого подхода. Однако было бы неплохо, если бы вы действительно могли сказать, что я делаю неправильно, используя «|» оператора в коде, что я не могу получить время времени в файле журнала – decisive

2

Механизма трубы используются для передачи вывода одной программы в качестве входных данных для следующей программы. Думаю, в вашем случае более подходящим будет && separator.

Try и пусть CMD обрабатывать выполнение нескольких операторов:

cmd /c "db2cmd ... && echo ..." 
+0

Привет, спасибо за ваше предложение. использование && не будет использовать мою цель i m, используя «|» потому что он даст мне вывод в журнале как

+0

Отменить порядок командной строки: 'echo ...> file && command ... >> file'.Я никогда не использовал оболочку командной строки Windows, но в linux ваш подход (труба через 'echo' не работала) –

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