我做了一个函数,您可以在其中获得命令的输出。它可以工作,但不会保留前一命令的状态,例如,如果您更改目录(cd dir),则新命令中不会更改它。我是否可以更改功能,以便在更改目录时将其保留在下一个命令中?这是我的功能:
int execute(char *command, char *output)
{
int rc;
char buffer[4096], *cmd;
DWORD byte, bytes;
HANDLE in_read, in_write, out_read, out_write;
PROCESS_INFORMATION pi;
SECURITY_ATTRIBUTES sa;
STARTUPINFO si;
cmd = malloc(sizeof(char) * (strlen(command) + 8));
strcpy(cmd, "cmd /c ");
strcat(cmd, command);
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));
ZeroMemory(&si, sizeof(STARTUPINFO));
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
rc = CreatePipe(&out_read, &out_write, &sa, 0);
check(rc != 0)
rc = SetHandleInformation(out_read, HANDLE_FLAG_INHERIT, 0);
check(rc != 0)
rc = CreatePipe(&in_read, &in_write, &sa, 0);
check(rc != 0)
rc = SetHandleInformation(in_write, HANDLE_FLAG_INHERIT, 0);
check(rc != 0)
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdError = out_write;
si.hStdOutput = out_write;
si.hStdInput = in_read;
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
rc = CreateProcess(NULL, cmd, NULL, NULL, TRUE, CREATE_NO_WINDOW,
NULL, NULL, &si, &pi);
check(rc != 0)
CloseHandle(out_write);
bytes = 0;
while (ReadFile(out_read, &buffer, 4096, &byte, NULL)) {
if (bytes == 0) {
bytes = bytes + byte;
check(bytes > sizeof(output))
strcpy(output, buffer);
ZeroMemory(&buffer, sizeof(buffer));
} else {
bytes = bytes + byte;
check(bytes > sizeof(output))
strcat(output, buffer);
ZeroMemory(&buffer, sizeof(buffer));
}
};
CloseHandle(in_read);
CloseHandle(in_write);
CloseHandle(out_read);
free(cmd);
return 1;
error:
free(cmd);
return -1;
}