#include "workspace/CommandExecutor.h" #include #include #include #include "common/SpdLogger.h" void CommandExecutor::Execute(WorkSpace* ws, WorkSpace::CommandWhen when) { if (!ws) return; if (!cmd_.enabled) return; const QString whenStr = (when == WorkSpace::CommandWhen::OnCreate) ? QStringLiteral("oncreate") : QStringLiteral("onload"); // Build final arguments (already prepared by manager but honor rawArgs if provided) QStringList argsList = cmd_.args; auto pushArgs = [&argsList](const QString& s) { if (!s.isEmpty()) { for (const auto& part : s.split(' ', Qt::SkipEmptyParts)) { argsList << part; } } }; if (!cmd_.rawArgs.isEmpty()) { pushArgs(cmd_.rawArgs); } const QString programLower = cmd_.program.toLower(); if (!cmd_.path.isEmpty()) { if (programLower.endsWith("cmd.exe")) { argsList << "/c" << cmd_.path; } else if (programLower.endsWith("powershell.exe")) { argsList << "-NoProfile" << "-ExecutionPolicy" << "Bypass" << "-File" << cmd_.path; } else { argsList << cmd_.path; } } QProcess proc; // Apply environment if provided if (!cmd_.env.empty()) { QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); for (auto it = cmd_.env.begin(); it != cmd_.env.end(); ++it) { env.insert(it.key(), it.value()); } proc.setProcessEnvironment(env); } proc.setProgram(cmd_.program); proc.setArguments(argsList); proc.setWorkingDirectory(cmd_.workingDir.isEmpty() ? ws->GetDir() : cmd_.workingDir); LOG_INFO("run command: name={} prog={} args={} cwd={} when={} desc={}", cmd_.name.toLocal8Bit().constData(), cmd_.program.toLocal8Bit().constData(), argsList.join(' ').toLocal8Bit().constData(), proc.workingDirectory().toLocal8Bit().constData(), whenStr.toLocal8Bit().constData(), cmd_.descript.toLocal8Bit().constData()); proc.start(); if (!proc.waitForStarted()) { LOG_WARN("command failed to start: {}", cmd_.program.toLocal8Bit().constData()); return; } proc.waitForFinished(cmd_.timeoutMs); const QByteArray out = proc.readAllStandardOutput(); const QByteArray err = proc.readAllStandardError(); LOG_INFO("command '{}' exitCode={} stdout={} stderr={}", cmd_.name.toLocal8Bit().constData(), proc.exitCode(), out.constData(), err.constData()); }