在命令函数中保存状态

Preserving status in command function

我制作了一个函数,您可以在其中获取命令的输出。它可以工作,但它不会保留上一个命令的状态,例如,如果您更改目录 (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;
    }

CreateProcess 开始一个全新的过程,运行 独立于您的过程。

如果您让该独立进程更改其自己的当前工作目录,那么它只会在新进程中更改,而不会在您的进程中更改运行您的程序。