Можно ли писать программы в cmd

У меня здесь серьезная проблема. Мне нужно выполнить командную строку CMD через C ++ без отображения окна консоли. Поэтому я не могу использовать system(cmd) , так как окно будет отображаться.

Я пробовал winExec(cmd, SW_HIDE) , но это тоже не работает. CreateProcess — еще один, который я пробовал. Однако это для запущенных программ или командных файлов.

Я попытался ShellExecute :

ShellExecute( NULL, «open», «cmd.exe», «ipconfig > myfile.txt», «c:projectsb», SW_SHOWNORMAL );

Может ли кто-нибудь увидеть что-то не так с приведенным выше кодом? Я использовал SW_SHOWNORMAL , пока не убедился, что это работает.

Мне действительно нужна помощь с этим. Ничего не выяснилось, и я уже давно пытаюсь. Любой совет, который мог бы дать кто-либо, был бы отличным 🙂

JP29 19 Июл 2012 в 19:51
Вы проверили код возврата?
19 Июл 2012 в 19:58
Я знаю, что у вас есть ответ, но обычно лучше сказать, почему это не работает.
20 Июл 2012 в 12:18

Команды в cmd для новичков

Почему бы не вызвать функции WMI_ и не записать результаты в файл. Нет окна и только данные, которые вам нужны.

graham.reeds
11 Мар 2016 в 11:35

6 ответов

Лучший ответ

Перенаправление вывода на ваш собственный канал — более аккуратное решение, потому что оно позволяет избежать создания выходного файла, но это отлично работает:

ShellExecute(0, «open», «cmd.exe», «/C ipconfig > out.txt», 0, SW_HIDE);

Вы не видите окно cmd, и вывод перенаправляется, как ожидалось.

Ваш код, вероятно, дает сбой (не считая /C ), потому что вы указываете путь как «c:projectsb» , а не «c:\projects\b» .

arx 19 Июл 2012 в 21:33

Вот моя реализация функции DosExec, которая позволяет (незаметно) выполнять любую команду DOS и получать сгенерированный вывод в виде строки Unicode.

// Convert an OEM string (8-bit) to a UTF-16 string (16-bit) #define OEMtoUNICODE(str) CHARtoWCHAR(str, CP_OEMCP) /* Convert a single/multi-byte string to a UTF-16 string (16-bit). We take advantage of the MultiByteToWideChar function that allows to specify the charset of the input string. */ LPWSTR CHARtoWCHAR(LPSTR str, UINT codePage) < size_t len = strlen(str) + 1; int size_needed = MultiByteToWideChar(codePage, 0, str, len, NULL, 0); LPWSTR wstr = (LPWSTR) LocalAlloc(LPTR, sizeof(WCHAR) * size_needed); MultiByteToWideChar(codePage, 0, str, len, wstr, size_needed); return wstr; >/* Execute a DOS command.

If the function succeeds, the return value is a non-NULL pointer to the output of the invoked command. Command will produce a 8-bit characters stream using OEM code-page. As charset depends on OS config (ex: CP437 [OEM-US/latin-US], CP850 [OEM 850/latin-1]), before being returned, output is converted to a wide-char string with function OEMtoUNICODE. Resulting buffer is allocated with LocalAlloc. It is the caller’s responsibility to free the memory used by the argument list when it is no longer needed.

To free the memory, use a single call to LocalFree function. */ LPWSTR DosExec(LPWSTR command) < // Allocate 1Mo to store the output (final buffer will be sized to actual output) // If output exceeds that size, it will be truncated const SIZE_T RESULT_SIZE = sizeof(char)*1024*1024; char* output = (char*) LocalAlloc(LPTR, RESULT_SIZE); HANDLE readPipe, writePipe; SECURITY_ATTRIBUTES security; STARTUPINFOA start; PROCESS_INFORMATION processInfo; security.nLength = sizeof(SECURITY_ATTRIBUTES); security.bInheritHandle = true; security.lpSecurityDescriptor = NULL; if ( CreatePipe( writePipe, // address of variable for write handle GetStartupInfoA( start.hStdOutput = writePipe; start.hStdError = writePipe; start.hStdInput = readPipe; start.dwFlags = STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW; start.wShowWindow = SW_HIDE; // We have to start the DOS app the same way cmd.exe does (using the current Win32 ANSI code-page). // So, we use the «ANSI» version of createProcess, to be able to pass a LPSTR (single/multi-byte character string) // instead of a LPWSTR (wide-character string) and we use the UNICODEtoANSI function to convert the given command if (CreateProcessA(NULL, // pointer to name of executable module UNICODEtoANSI(command), // pointer to command line string security, // pointer to thread security attributes TRUE, // handle inheritance flag NORMAL_PRIORITY_CLASS, // creation flags NULL, // pointer to new environment block NULL, // pointer to current directory name processInfo // pointer to PROCESS_INFORMATION ))< // wait for the child process to start for(UINT state = WAIT_TIMEOUT; state == WAIT_TIMEOUT; state = WaitForSingleObject(processInfo.hProcess, 100) ); DWORD bytesRead = 0, count = 0; const int BUFF_SIZE = 1024; char* buffer = (char*) malloc(sizeof(char)*BUFF_SIZE+1); strcpy(output, «»); do < DWORD dwAvail = 0; if (!PeekNamedPipe(readPipe, NULL, 0, NULL, // error, the child process might have ended break; >if (!dwAvail) < // no data available in the pipe break; >ReadFile(readPipe, buffer, BUFF_SIZE, buffer[bytesRead] = ‘’; if((count+bytesRead) > RESULT_SIZE) break; strcat(output, buffer); count += bytesRead; > while (bytesRead >= BUFF_SIZE); free(buffer); > > CloseHandle(processInfo.hThread); CloseHandle(processInfo.hProcess); CloseHandle(writePipe); CloseHandle(readPipe); // convert result buffer to a wide-character string LPWSTR result = OEMtoUNICODE(output); LocalFree(output); return result; >

Читайте также:
Как фигуристы запоминают программу

Источник: question-it.com

Как вы кодируете в CMD?

Запустите окно командной строки (Пуск-> Выполнить -> ‘cmd’), это откроет окно и покажет приглашение, скорее всего, «c: » или какой-либо другой путь. Теперь, используя любой редактор, который вам нравится, создайте текстовый файл с этой командой в качестве единственной строки. Назовите файл «hello. Bat».

Какой язык программирования используется в CMD?

4 ответа. В Windows, когда вы открываете командную строку, почти всегда выполняется программа cmd.exe. Это усиленная производная NT из старого command.com, основанного на DOS, который, в свою очередь, имеет аналогичные элементы с еще более старым интерпретатором команд CP / M CCP.

Какие основные команды в cmd?

Cmd-команды под Windows

команда cmdОписание
CD сменить каталог
cls очисти экран
cmd Начните командная строка
цвет изменить цвет консоли

Как запустить скрипт в CMD?

  1. Из меню «Пуск»: ПУСК> ВЫПОЛНИТЬ c: path_to_scripts my_script.cmd, ОК.
  2. «c: путь к скриптам my script.cmd»
  3. Откройте новое приглашение CMD, выбрав START> RUN cmd, OK.
  4. В командной строке введите имя сценария и нажмите клавишу возврата. .
  5. Также возможно запускать пакетные сценарии со старым (стиль Windows 95).

Как называется код CMD?

В командной строке Windows используется искаженный язык, который иногда называют Пакетный язык DOS. В более поздних версиях Windows также есть программа под названием PowerShell, которая теоретически избавляет от необходимости использовать пакетный язык DOS.

Cmd.exe — это вирус?

Что такое Cmd.exe? Законный файл Cmd.exe — это важный командный процессор Windows, расположенный в C: Windows System32. Спамеры подражают его названию посадить вирус и выкладываю в Интернете.

Что означает * * в CMD?

В данном случае мы использовали подстановочный знак * для обозначения «все файлы в текущем каталоге». Эта команда печатает строку, содержащую заданную строку, и, если в списке более одного файла, имя файла, в котором он был найден. Чтобы проверить файлы в подкаталогах, также используйте флаг -r с командой grep.

Что такое команды?

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

Сколько там команд CMD?

Командная строка в Windows предоставляет доступ к более 280 команд. Эти команды используются для выполнения определенных задач операционной системы из интерфейса командной строки вместо графического интерфейса Windows, который мы используем большую часть времени.

Как запустить сценарий?

  1. Создайте ярлык для Google Analytics.
  2. Щелкните ярлык правой кнопкой мыши и выберите «Свойства».
  3. В поле Target введите соответствующий синтаксис командной строки (см. Выше).
  4. Щелкните ОК.
  5. Дважды щелкните ярлык, чтобы запустить сценарий.

Как создать сценарий?

  1. Выделите команды из истории команд, щелкните правой кнопкой мыши и выберите «Создать сценарий».
  2. Нажмите кнопку «Новый сценарий» на вкладке «Главная».
  3. Воспользуйтесь функцией редактирования. Например, редактирование new_file_name создает (если файл не существует) и открывает файл new_file_name.
Читайте также:
Web редактор это программа для создания

Что лучше cmd или PowerShell?

PowerShell — это более продвинутая версия cmd используется для запуска внешних программ, таких как ping или copy, и автоматизации множества различных задач системного администрирования, недоступных из cmd.exe. Он очень похож на cmd, за исключением того, что он более мощный и использует совсем другие команды.

CMD устарел?

Оболочка Windows Cmd / командной строки НЕ удаляется из Windows в ближайшем или отдаленном будущем! Оболочка Cmd остается важной частью Windows и ежедневно используется миллионами компаний, разработчиков и ИТ-специалистов по всему миру.

Источник: ch-pik.ru

Запись вывода команды в Windows cmd в файл (с изюминкой)

Поэтому я пытаюсь запустить foo.exe , но я не хочу выводить данные в терминал, а в файл. Запуск foo.exe > foo.txt должен сделать это для меня, но это не так. Когда я запускаю exe-файл, я получаю вывод. Exe работает нормально, другими словами. Тем не менее, когда я пытаюсь отправить вывод в файл, единственное, что я получаю, это:

‘c:/Program’ is not recognized as an internal or external command, operable program or batch file.

Это появляется только когда я пытаюсь отправить его в файл. Думая, что это может быть путь (который является c:Program Files (x86) и т.д.), Который неверно истолкован, я попытался указать выходной файл следующим образом: foo.exe > c:test.txt , но все еще нет радость.

Итак, помимо заявления о том, что бинарный файл, который я пытаюсь запустить, плохо написан, могу ли я что-нибудь сделать, чтобы исправить это? Имейте в виду, что я получаю корректный вывод при простом запуске exe, он просто не будет хорошо печататься в файл. Очевидно, что выход есть, вопрос в том, есть ли какой-нибудь способ его поймать.

задан pzkpfw 763

1 ответ 1

Вы не показали команду, которую вы используете, которая не работает. Если вы покажете это в своем вопросе, возможно, вам будет легче найти решение. Я ожидаю, что ваша команда примерно такая:

C:> foo.exe|c:Program Files (x86)somethingtest.txt

Ошибка, которую вы получаете, является своего рода подсказкой:

‘c:/Program’ is not recognized as an internal or external command, operable program or batch file.

Первый:
. is not recognized as an internal or external command, operable program or batch file. Обычно это происходит, когда вы пытаетесь перенаправить в файл, используя | вместо > . Во-вторых:
‘c:/Program’ . При указании имени файла (или пути), содержащего пробелы, вы должны заключить его в двойные кавычки ( «. » ). Это связано с тем, что, когда ОС определяет файл для перенаправления, она прекращает поиск имени файла при обнаружении пробела без кавычек: «c:/Program» . Попробуй это:

foo.exe>»c:Program Files (x86)somethingtest.txt»

Если вышеупомянутое не работает, чтобы захватить выходные данные из foo.exe в текстовый файл, то есть другая возможность . Если программа foo.exe записывает свои выходные данные в STDERR вместо STDOUT , выходные данные foo.exe не будут записываться с помощью простого перенаправления с одним > . Вы должны сделать это так:

foo.exe>»c:Program Files (x86)somethingtest.txt» 2>нормальный» вывод в поток 1.

  • Поток 2 называется STDERR или Standard-Error. Обычно программы записывают свои выходные данные «Error» (сообщения об ошибках и предупреждения) в поток 2.
  • Записывает ли программа определенный вывод в STDOUT или STDERR , определяется программистом и тем, как они написали программу. Некоторые программы написаны для отправки всех выходных данных (нормального вывода и ошибок) в STDOUT .

    Когда программа запускается без перенаправления вывода, все нормальные и ошибочные выходные данные отправляются на экран терминала без какого-либо различия между выходом STDOUT или выходом STDERR .

    Когда вы делаете «нормальное» перенаправление с одним > как это:

    foo.exe > «c:Program Files (x86)somethingtest.txt»

    вы не указываете, какой поток перенаправляется в файл, поэтому предполагается, что поток 1.

    Это так же, как если бы вы напечатали это так:

    foo.exe 1> «c:Program Files (x86)somethingtest.txt»

    Это говорит интерпретатору команд ( cmd.exe ) перехватить выходные данные программы для STDOUT (поток 1) с указанным именем файла. 1 в 1> относится к потоку 1.

    В этом случае вся обычная программа записывается в файл, но если программа записывает в STDERR (поток 2), этот вывод не будет записан и будет показан на экране. Как правило, это «желательный» способ сделать это так, чтобы во время захвата нормального вывода программы вы могли видеть на экране, если произошла ошибка.

    Читайте также:
    В какой программе работать с портфолио

    Если вы хотите записать вывод «Normal» в один файл, а вывод «Error» в другой файл, вы можете сделать это следующим образом:

    foo.exe > «c:output.txt» 2> «C:error.txt» or foo.exe 1> «c:output.txt» 2> «C:error.txt»

    Если вы хотите, чтобы вывод «Normal» и вывод «Error» были записаны в один и тот же файл, вы можете указать его следующим образом:

    foo.exe > «c:output.txt» 2>сокращенный» способ его указания, и он означает перенаправление потока 1 в указанный файл, а также перенаправление потока 2 в то же «место» (файл), что и поток 1.

    Редактировать:

    Есть ли разница между foo.exe> «c:output.txt» 2> «c:output.txt» 2> «c:output.txt»? Они идентичны?

    Краткий ответ: Вы могли бы подумать, что они идентичны, но нет. Они разные.

    При перенаправлении с использованием >»filename.ext» , 1>»filename.ext» или 2>»filename.ext» , > приводит к записи вывода в новый файл с именем «filename.ext». Если файл «filename.ext» уже существует, он будет удален первым.

    foo.exe> «c:output.txt» 2> «c:output.txt»

    вызывает «конфликт», когда оба перенаправления пытаются записать в один и тот же файл, и оба пытаются удалить файл, если он уже существует. Это может вызвать нежелательное поведение. Как правило, один или другой, или оба, выходы НЕ будут захвачены полностью или предсказуемо.

    Фактический результат будет зависеть от операционной системы и версии, а также может зависеть от выполняемой команды. Что, скорее всего, произойдет:

    1 Выход, отправленный на одно из перенаправлений, будет захвачен или частично захвачен, а выход, отправленный на другое перенаправление, будет потерян. 2 Операционная система будет жаловаться на команду, и ни один из выходов не будет зафиксирован (полностью). 3 Неопределенное, нежелательное, непредсказуемое, неожиданное поведение.

    В Windows 7 и, вероятно, в Windows Vista/8/10 и, возможно, в Windows XP, операционная система будет жаловаться на команду, и команда будет отменена.

    Например (Windows 7): у меня есть папка с именем: «C:Tempemptyfolder» а файл с именем » nonexistantfile» там не существует.

    C:>cd «Tempemptyfolder» C:Tempemptyfolder>dir nonexistantfile>output.txt File Not Found C:Tempemptyfolder>type output.txt Volume in drive F is FFFFx1tb Volume Serial Number is 4011-A5C6 Directory of C:Tempemptyfolder C:Tempemptyfolder>

    В этом случае, используя одно перенаправление ( >output.txt ), вывод команды dir записывается в файл: output.txt , и на экране отображается сообщение об ошибке File Not Found . это ожидаемое поведение ,

    Теперь, используя оба перенаправления («> файл» И «2> файл»):

    C:Tempemptyfolder>dir nonexistantfile>output.txt 2>output.txt The process cannot access the file because it is being used by another process. C:Tempemptyfolder>type output.txt C:Tempemptyfolder>

    В этом случае операционная система жаловалась, что (выходной) файл уже используется. И файл «output.txt» заканчивается пустым (0 байт), и выходные данные для обоих перенаправлений были потеряны.

    Теперь, наконец, используя оба перенаправления («> файл» И «2> ):

    C:Tempemptyfolder>dir nonexistantfile>output.txt 2>type output.txt Volume in drive C is CCCCCCCC Volume Serial Number is 1234-ABCD Directory of C:Tempemptyfolder File Not Found C:Tempemptyfolder>

    В этом случае «> файл» приводит к тому, что вывод для «потока 1» («стандартный вывод») записывается в файл. И «2> заставляет вывод для «потока 2» («вывод ошибки») отправляться через уже перенаправленный «поток 1», а также записываться в (тот же) файл.

    Также стоит отметить, что порядок важен. В обратном порядке, как это:

    dir nonexistant 2>output.txt

    не то же самое и, вероятно, не даст вам желаемого результата.

    В этом случае «2> потока 2″ («вывод ошибки») перенаправляется в то место, куда в данный момент направлен «поток 1», что при этом моментом является (по умолчанию) экран. И «> file» приводит к тому, что вывод для «stream 1» («стандартный вывод») записывается в файл. Конечным результатом является то, что вывод команды («поток 1») будет записан в файл, но вывод ошибок («поток 2») все равно будет отображаться на экране (а не в файле).

    Источник: poweruser.guru

    Рейтинг
    ( Пока оценок нет )
    Загрузка ...
    EFT-Soft.ru