如何通过编程判断MS Project向Project Server的发布已完成?
解决方案:判断Project Server发布完成并安全签入文件
一、通过CSOM查询发布任务状态
Project Server的发布操作会被加入服务器的排队作业队列,可以通过CSOM(Client Side Object Model)查询该队列的状态,确认发布作业完成后再执行签入:
核心逻辑:
- 执行发布操作后,获取当前项目的ID
- 连接到PWA,查询排队作业中属于该项目的最新发布任务
- 轮询检查任务状态,直到状态变为成功或失败
关键代码示例:
// 初始化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
相关产品推荐
相关产品推荐

