You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过编程判断MS Project向Project Server的发布已完成?

解决方案:判断Project Server发布完成并安全签入文件

一、通过CSOM查询发布任务状态

Project Server的发布操作会被加入服务器的排队作业队列,可以通过CSOM(Client Side Object Model)查询该队列的状态,确认发布作业完成后再执行签入:

  1. 核心逻辑:

    • 执行发布操作后,获取当前项目的ID
    • 连接到PWA,查询排队作业中属于该项目的最新发布任务
    • 轮询检查任务状态,直到状态变为成功或失败
  2. 关键代码示例:

    // 初始化CSOM上下文
    using (var context = new ProjectContext("https://你的PWA地址"))
    {
        context.Credentials = new NetworkCredential("用户名", "密码");
        
        // 获取目标项目ID(需从MS Project对象中提前获取)
        Guid projectId = new Guid("项目GUID");
        var project = context.Projects.GetById(projectId);
        context.Load(project);
        context.ExecuteQuery();
    
        // 查询该项目的最新发布排队作业
        var jobQuery = context.LoadQuery(
            context.QueueJobs
                .Where(j => j.ProjectId == projectId && j.JobType == QueueJobType.PublishProject)
                .OrderByDescending(j => j.SubmittedDate)
        );
        context.ExecuteQuery();
    
        // 轮询等待发布完成
        QueueJob latestPublishJob = jobQuery.FirstOrDefault();
        if (latestPublishJob != null)
        {
            while (latestPublishJob.JobState == JobState.Processing || latestPublishJob.JobState == JobState.Waiting)
            {
                Thread.Sleep(2000); // 每2秒检查一次
                context.Load(latestPublishJob);
                context.ExecuteQuery();
            }
    
            // 发布成功后执行签入
            if (latestPublishJob.JobState == JobState.Success)
            {
                application.FileCloseEx(PjSaveType.pjDoNotSave, CheckIn: true);
            }
            else
            {
                throw new Exception($"发布失败,状态:{latestPublishJob.JobState}");
            }
        }
    }
    

二、MS Project VBA/COM的轻量方案

如果不想引入CSOM,可通过轮询项目的LastPublishedDate属性间接判断发布完成:

Sub PublishAndCheckIn()
    Dim originalPublishDate As Date
    originalPublishDate = ActiveProject.LastPublishedDate
    
    ' 执行发布
    Application.Publish
    
    ' 轮询检查发布日期更新
    Dim waitTime As Integer
    waitTime = 0
    Do While ActiveProject.LastPublishedDate <= originalPublishDate And waitTime < 300 ' 超时5分钟
        Application.Wait Now + TimeValue("00:00:02")
        waitTime = waitTime + 2
    Loop
    
    ' 确认完成后签入
    If ActiveProject.LastPublishedDate > originalPublishDate Then
        Application.FileCloseEx pjDoNotSave, CheckIn:=True
    Else
        MsgBox "发布超时,请手动检查状态"
    End If
End Sub

三、注意事项

  • 轮询间隔建议设置为2-5秒,避免过度占用服务器资源
  • 必须配置超时时间,防止程序无限等待
  • 使用CSOM时,确保程序拥有访问PWA排队作业的权限

内容的提问来源于stack exchange,提问作者Kenny Arnold

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 08:01:21