这看起来有点疯狂,但如果你能告诉我一个更好的方法,请做。 我需要一个webservice来显示当前版本的mercurial修订号。
我有一个非常简单的批处理文件,可以将此编号写入文本文件
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
我已经授予Everyone写入服务目录的权限并明确地在version.txt上,但是当我点击页面时,version.txt文件始终为空。如果我在notepad ++中打开文件,那么我会收到一条消息,说该文件已被其他程序修改过,我是否要重新加载它。当我这样做时,它是空的。如果我在文件中设置了一些文本并保存它,那么再次访问网页我的文本文件的内容就会被删除。
我在try / catch块中有这个但是没有抛出任何异常,所以我删除了它(为了清楚起见)。
最终我需要的是获得结果
hg识别--num
在网页/服务上显示为字符串,该字符串将由单独的SharePoint网站调用
答案 0 :(得分:0)
批处理文件为空的原因是,只要父线程处于活动状态,启动并以这种方式运行的进程才能生效。此外,使用Process.Start
不会等待该过程完成。作为specified in the documentation,此方法的返回是一个布尔值,表示进程已启动或未启动。由于您将其视为空白,因此只要流程启动,您的程序就会一直运行并完成(因为它是一个Web服务)。
一旦您的Web服务退出子服务,该线程就会终止,并且所有子进程都会随之终止。具体来说,当你的流读取器读取空文件时,当前运行批处理文件的cmd.exe在它真正开始之前就会被终止。
如果您可以保证批处理文件处理速度相当快,您可能会尝试使用Thread.Sleep
来使Web服务调用暂停足够长时间以使该批处理文件完成处理,但这始终是将成为一个竞争条件。
答案 1 :(得分:0)
我会直接调用Mercurial并从其标准输出流中读取:
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()
答案 2 :(得分:0)
您不必在每次请求页面时从Web服务器手动调用批处理文件,而是可以配置Mercurial更新挂钩,以便在每次工作副本更新时自动调用您的identify命令。
例如,将其添加到存储库的.hg\hgrc
文件中:
[hooks]
update.writeversion = hg identify --num > services\version.txt
有关挂钩的其他信息的链接: