2012-06-14 145 views
1

這看起來有點瘋狂,但如果你能告訴我更好的方法,請做。 我需要一個webservice來顯示當前版本的mercurial修訂號。從webservice調用批處理文件以寫入文本文件

我有寫這個數字到一個文本文件

cd C:\inetpub\wwwroot\MyWebsite 
hg identify --num > services\version.txt 

應該調用批處理文件,然後讀取文件的內容,並且對於現在的方法很簡單的批處理文件,寫屏幕(我做的一個網頁,但將遷移到一個簡單的服務後)

Private Sub GetVersionNumber() 
    Dim versionFile = Server.MapPath("~/services/version.txt") 
    Dim batchFile = Server.MapPath("~/services/version.bat") 
    Process.Start(batchFile) 

    Dim revision As String = String.Empty 
    Using reader As New StreamReader(versionFile) 
     Do While reader.Peek() <> -1 
      revision = reader.ReadLine() 
     Loop 
    End Using 
    Response.Write(revision) 
End Sub 

我已授予每個人都寫訪問服務目錄,並明確對version.txt,但是當我打該頁面是version.txt文件總是空的。如果我在記事本++中打開該文件,那麼我會收到一條消息,指出該文件已被其他程序修改過,是否需要重新加載它。當我做它是空的。如果我在文件中設置了一些文本並保存,然後再次訪問網頁,我的文本文件的內容就會被清除。

我在try/catch塊中有這個,但沒有拋出異常,所以我刪除了它(爲了清楚起見)。

最終所有我需要的是得到
結果汞識別--num
顯示爲對網頁/服務,將通過一個單獨的SharePoint網站

+0

請注意,每次工作副本更新時,您都可以配置Mercurial'update'掛鉤來自動調用您的'identify'命令。 –

+0

這樣_could_更新文本文件?這意味着每次頁面被調用時都不需要發生......這會更好。這將如何工作? –

+1

是的。在存儲庫的'.hg \ hgrc'文件的[hooks]部分添加如下內容:'update.writeversion = hg identify --num> services \ version.txt'。更多信息:http://hgbook.red-bean.com/read/handling-repository-events-with-hooks.html,http://mercurial.selenic.com/wiki/Hook和http://www.selenic .com/mercurial/hgrc.5.html#hooks –

回答

0

究其原因,被稱爲串批處理文件是空的,只要父線程處於活動狀態,啓動並以此方式運行的進程只能處於活動狀態。此外,使用Process.Start不會等待該過程完成。由於specified in the documentation,此方法的返回值是一個布爾值,指示進程已啓動或未啓動。由於您將它視爲無效,只要進程啓動,您的程序就會正確運行並結束(因爲它是Web服務)。

一旦你的web服務退出sub,線程就會被終止,所有的子進程都會被終止。特別是,當前正在運行您的批處理文件的cmd.exe會在您的流讀取器正在讀取空文件後才能真正開始執行。

如果您可以保證您的批處理文件處理速度相當快,您可能會試圖擺脫使用Thread.Sleep導致Web服務調用暫停足夠長的時間,以便該批處理文件完成處理,但這總是會競賽狀況。

+0

我在調用Process.Start後添加了Threading.Thread.Sleep(2000),但未改變結果。該文本文件仍然說它已被更改,但沒有內容。當我從命令行調用批處理文件併產生內容爲「740」(當前版本號)的文本文件 –

+0

@SimonMartin時,批處理文件幾乎立即運行:就像我說的,競爭條件是您的Web服務可能沒有贏過。請記住,除批處理文件正在運行外,它還必須暫存cmd.exe,並且如果它遇到與文件的衝突(例如,Web服務已打開它),它將不會報告錯誤。你也可能想看看UseShellExecute屬性。 http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.useshellexecute.aspx –

+0

該過程似乎很快,我將睡眠延長到15000,但在該時間很久之前文本文件得到「更改」已經到了。它在2000年睡眠之前變得更改了 –

0

我就直接打電話給水銀,並從它的標準輸出流中讀取:

var hg = new ProcessStartInfo("C:\Program Files\Mercurial\hg.exe", "identify --num -R c:\inetpub\webroot"); 
hg.RedirectStandardOutput = True; 
hg.RedirectStandardInput = True; 
hg.UseShellExecute = False; 
hg.CreateNoWindow = True; 

var hgProc = New Process() 
hgProc.StartInfo = hg 
hgProc.Start() 

var repoID = hgProc.StandardOutput.ReadToEnd() 
相關問題