1

这可能看起来有点疯狂,但如果你能告诉我更好的方法,请这样做。我需要一个 web 服务来显示当前版本的 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

我已授予每个人对服务目录的写入权限,并明确授予 version.txt,但是当我点击页面时,version.txt 文件始终为空。如果我在记事本++中打开了文件,那么我会收到一条消息,说文件已被另一个程序修改,我想重新加载它吗?当我这样做时,它是空的。如果我在文件中设置一些文本并保存,然后再次访问网页,我的文本文件的内容就会被清除。

我在 try/catch 块中有这个,但没有抛出异常,所以我删除了它(为了清楚起见)。

最终,我只需要获取
hg identify --num的结果,
以在网页/服务上显示为字符串,该字符串将由单独的 SharePoint 站点调用

4

3 回答 3

0

批处理文件为空的原因是,以这种方式启动并运行的进程只有在父线程处于活动状态时才能处于活动状态。此外, usingProcess.Start不会等待该过程完成。如文档中所述,此方法的返回值是一个布尔值,指示该过程是否开始。由于您将其视为无效,因此一旦进程启动,您的程序就会继续运行并完成(因为它是一个 Web 服务)。

一旦您的 Web 服务退出子程序,线程就会终止,所有子进程也会随之终止。具体来说,当前正在运行批处理文件的 cmd.exe 在它真正开始之前就被终止了,因为您的流读取器正在读取一个空文件。

如果您可以保证您的批处理文件将很快处理,您​​可能会尝试避免使用Thread.Sleep导致 Web 服务调用暂停足够长的时间以使该批处理文件完成处理,但这始终是一个竞争条件。

于 2012-06-14T10:36:31.627 回答
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()
于 2012-06-15T14:05:00.237 回答
0

您可以配置 Mercurial 更新挂钩以在每次工作副本更新时自动调用您的识别命令,而不是每次请求页面时都从 Web 服务器手动调用批处理文件。

例如,将其添加到存储库的.hg\hgrc文件中:

[hooks]
update.writeversion = hg identify --num > services\version.txt

一些带有钩子附加信息的链接:

于 2012-06-18T10:35:09.187 回答