2009-03-19 7 views
3

Est-il possible d'écrire une Condition dans msbuild qui vérifie si un certain processus existe? Ou bien, quelqu'un d'autre connaît-il une telle tâche?MSBuild: Comment puis-je vérifier si un processus existe?

Aujourd'hui, mon processus crée un fichier pid, dont je vérifie l'existence. Mais je n'aime pas toute la maintenance supplémentaire impliquée avec un tel fichier.

Des idées?

Répondre

5

Il n'existe aucune tâche de ce type dans MSBuild Extension Pack ou dans MSBuild Community Tasks. Mais vous pouvez facilement en créer un. Quelque chose comme ceci:

using System.Diagnostics; 
using Microsoft.Build.Framework; 
using Microsoft.Build.Utilities; 

namespace StackOverflow.MSBuild 
{ 
    public class IsProcessRunning : Task 
    { 
    private string processName; 
    private bool isRunning; 

    [Required] 
    public string ProcessName 
    { 
     get { return processName; } 
     set { processName = value; } 
    } 

    [Output] 
    public bool IsRunning 
    { 
     get { return isRunning; } 
    } 

    public override bool Execute() 
    { 
     if(string.IsNullOrEmpty(processName)) 
     { 
     Log.LogError("ProcessName could not be empty"); 
     return false; 
     } 

     foreach(Process clsProcess in Process.GetProcesses()) 
     { 
     if(clsProcess.ProcessName.Contains(processName)) 
     { 
      isRunning = true; 
     } 
     } 

     return true; 
    } 
    } 
} 

Et vous l'utiliser comme ça:

<UsingTask AssemblyFile="$(Task_Assembly_path)" 
     TaskName="StackOverflow.MSBuild.IsProcessRunning" /> 

<Target Name="TestTask"> 
    <IsProcessRunning ProcessName="${Process}"> 
    <Output ItemName="Result" TaskParameter="IsRunning"/> 
    </IsProcessRunning> 

    <Message Text="Process ${Process} is running" 
      Condition="'${Result}' == 'true'"/> 
</Target> 
+0

Je suggère d'utiliser Process.GetProcessesByName (). En outre, dans C# 3.0, vous pouvez utiliser des déclarations de propriété triviales, qui réduisent le fouillis, par exemple: chaîne publique "ProcessName {get; set;}" "public bool IsRunning {get; private set;}" – Wedge

Questions connexes