Как получить исходные аргументы командной строки
Мне нужно передать аргументы командной строки из A.exe в B.exe. Если A.exe с несколькими аргументами вроде
A.exe -a="a" -b="b"'
и я могу использовать
BeginProcess("B.exe", **args!**)
чтобы запустить B.exe.
Как получить исходные аргументы командной строки, например
'-a="a" -b="b"'
Ответы
Ответ 1
Если вы находитесь в Windows, вы используете GetCommandLine для получения исходной командной строки.
Обратите внимание, что GetCommandLine также включает argv [0]. Поэтому вам нужно выйти за пределы argv [0] из вывода GetCommandLine, прежде чем передать его в B.
Это некорректный код, не проверяемый ошибкой, чтобы сделать это
#include <string.h>
#include <windows.h>
#include <iostream>
#include <ctype.h>
int main(int argc, char **argv)
{
LPTSTR cmd = GetCommandLine();
int l = strlen(argv[0]);
if(cmd == strstr(cmd, argv[0]))
{
cmd = cmd + l;
while(*cmd && isspace(*cmd))
++cmd;
}
std::cout<<"Command Line is : "<<cmd;
}
Когда я запускаю указанную выше программу как A.exe -a="a" -b="b"
, я получаю следующий вывод
A.exe -a="a" -b="b"
Command Line is : -a="a" -b="b"
Ответ 2
Вот один и единственный правильный способ пропустить имя исполняемого файла, основанный на реализации Wine CommandLineToArgvW:
char *s = lpCmdline;
if (*s == '"') {
++s;
while (*s)
if (*s++ == '"')
break;
} else {
while (*s && *s != ' ' && *s != '\t')
++s;
}
/* (optionally) skip spaces preceding the first argument */
while (*s == ' ' || *s == '\t')
s++;
Ответ 3
Стандартное определение main
равно
int main(int argc, char* argv[])
Переменная argv
содержит аргументы командной строки. Переменная argc
указывает количество записей в массиве argv
.
Ответ 4
Необработанная строка, введенная в оболочку, преобразуется оболочкой в argv
до запуска вашей программы. Я никогда не слышал о операционной системе или оболочке, предоставляющей "сырую" командную строку в дополнение к argv
.
Что делать, если пользователь использовал кавычки для передачи пробела в ваши аргументы? Что делать, если они использовали обратную косую черту, чтобы избежать цитаты внутри кавычек? Различные оболочки могут даже иметь разные правила кавычек.
Если у вас есть список вроде argv
, вы должны попытаться найти API, который соглашается с этим, а не пытаться реализовать строковую обработку, которая только вспомогательна к фактической цели. Microsoft серьезно относится к безопасности, и они, безусловно, предоставляют то, что не требует добавления в ваше приложение дыры безопасности.
Я не могу найти документацию о любом C/С++ API BeginProcess
; Я вроде бы предполагаю, что это Windows, но в любом случае вам стоит дважды проверить справочное руководство по платформе для альтернативного системного вызова.
Ответ 5
Вот как я перехожу к командной строке в shell args. Иногда это хорошо, чтобы эхо в выходной файл, чтобы сохранить "какие аргументы были использованы" вместе с выходом. Уклонение является рудиментарным и достаточным для большинства ситуаций.
Я начал вывод по команде (i = 0). Вы можете изменить на (i = 1), если хотите только аргументы и т.д.
//you have to free() the result!, returns null if no args
char *arg2cmd(int argc, char** argv) {
char *buf=NULL;
int n = 0;
int k, i;
for (i=0; i <argc;++i) {
int k=strlen(argv[i]);
buf=( char *)realloc(buf,n+k+4);
char *p=buf+n;
char endq=0;
// this is a poor mans quoting, which is good enough for anything that not rediculous
if (strchr(argv[i], ' ')) {
if (!strchr(argv[i], '\'')) {
*p++='\'';
endq='\'';
} else {
*p++='\"';
endq='\"';
}
}
memcpy(p, argv[i], k);
p+=k;
if (i < (argc-1)) *p++=' ';
if (endq) *p++=endq;
*p='\0';
n = p-buf;
}
return buf;
}
И простая оболочка cpp:
std::string arg2string(int argc, char **argv) {
char *tmp=arg2cmd(argc, argv);
std::string ret=tmp;
free(tmp);
return ret;
}
Ответ 6
В C++/CLI есть это:
String^ cmdarg = Environment::CommandLine;