2017-06-16 56 views
2

我想在PowerShell中编写类似CSharp watch任务的东西。所以,我想要发生的是当CSharp文件在某个目录中发生更改时,它会尝试查找csproj文件并启动构建。我如何在PowerShell中运行PowerShell中的MSBuild任务

这是我目前有

function Watch-CSharp-Files() { 
    set-location "D:\path\to\csharp\files\" 

    $originalPath = Get-Location 

    Write-host "Welcome to The Watcher. It keeps track of changing files in this solution directory (including subdirectories) and triggers a build when something changes..." 

    $existingEvents = get-eventsubscriber 
    foreach ($item in $existingEvents) { 
     Unregister-event -SubscriptionId $item.SubscriptionId 
     write-host "Unsubscribed existing event:" $item.Action.Name 
    } 

    $folder = get-location 
    $filter = '*.*' 
    $watcher = New-Object IO.FileSystemWatcher $folder, $filter -Property @{IncludeSubdirectories = $true;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'} 

    Register-ObjectEvent $watcher Changed -SourceIdentifier FileChanged -Action { 
     $path = $Event.SourceEventArgs.FullPath 

     if ($path -match "(\.cs~|.cs$)") { 
      write-host "file changed: $path" 
      Invoke-Expression -Command "Find-And-Build-Project '$path'" 
     } 
    } 
} 

function Find-And-Build-Project([string]$path) { 
    write-host "BUILD PROJECT REPORTING FOR DUTY" 

    $pathParts = "$path".Split("\\") 
    $end = $pathParts.Count - 2 # skip the file name to the parent directory 
    $testPath = $pathParts[0..$end] -join "\" 
    write-host "testing path $testPath" 
    $csproj = Get-ChildItem -path $testPath *.csproj 

    For ($i = 0; $i -le 10; $i++) {  
     $newEnd = $end - $i 
     $newPath = $pathParts[0..$newEnd] -join "\" 
     $csproj = Get-ChildItem -path $newPath *.csproj 
     write-host "$i. trying: $newPath, csproj: $csproj" 
     if ($csproj) { 
      write-host "found on $i, at $newPath, $csproj" 
      break 
     } 
    } 

    write-host "Ready: $newPath\$csproj" 
    $msbuild = "C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" 
    write-host "trying to MSBUILD"  
    & $msbuild ("$newPath\$csproj", "/target:Build", "/p:configuration=debug", "/verbosity:n")  
} 

Watch-CSharp-Files 

我发现是函数Find-And-Build-Project,内& $msbuild不会被调用。但是,我不明白为什么。

任何想法?

回答