繁体   English   中英

如何在C#中捕获命令提示符过程并在此之后执行某些操作?

how to catch command prompt process finish in C# and do something after that?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在处理语音记录。 我需要使用.exe文件将Wav转换为.mp3文件。 一切都很好,我可以执行此exe,但是当进程以我的输出.mp3文件结束时,我需要做一些事情。 我知道我的输出目录,但在尚未创建MP3文件之前无法处理。 我知道也许我需要使用Thread.sleep(); 或类似的东西,因为我无法在文件不存在之前捕获它。

这是我的代码:

string mp3GuidName = Guid.NewGuid().ToString();
var mp3FilePath = WavFilePath.Replace("finalWavFile", mp3GuidName).Replace("wav", "mp3");
var extrasFilePath = HttpContext.Current.Server.MapPath("/").Replace("DevApp.Web", "Extras");

string strArguments = "/c start " +  extrasFilePath + "lame.exe --abr 80 -V5 " + WavFilePath + " " + mp3FilePath;

System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.CreateNoWindow = false;
startInfo.UseShellExecute = false;
startInfo.FileName = "cmd.exe";
startInfo.Arguments =  strArguments ;
process.StartInfo = startInfo;
process.Start();
var attactment = new Attachment
    {
        CreatedOn = DateTime.Now,
        UpdatedOn = DateTime.Now,
        Title = mp3GuidName +".mp3",
        Size = _storageProvider.GetFile(mp3FilePath).GetSize(), // here I am trying to get mp3 file but i cant catch it. Because if this wav files size is huge, then convert process is taking time and my mp3 file is not created yet.
        FileExtension = _storageProvider.GetFile(mp3FilePath).GetFileType()
    };
attactment.MimeType = _storageProvider.GetMimeType(attactment.FileExtension);
attactment.FileUrl = mp3GuidName+".mp3";// file.GetName();
attactment.AttachmentFolderId = folder.Id;
_attachmentRepository.Add(attactment);

我试图使用process.WaitForExit(); 但我不能解决这个问题。 我仍然无法访问mp3文件。

那么如何在过程完成时捕获?

最好的祝福。

2 个回复

从参数字符串中删除start命令参数,您应该可以使用process.WaitForExit(); 等待Lame完成编码:

string strArguments = "/c " +  extrasFilePath + "lame.exe --abr 80 -V5 " + WavFilePath + " " + mp3FilePath;


但是,您可以通过直接启动lame.exe来简化代码并完全避免与cmd.exe发生这种冲突:

string strArguments = "--abr 80 -V5 " + WavFilePath + " " + mp3FilePath;
...
startInfo.FileName = extrasFilePath + "lame.exe";
startInfo.Arguments = strArguments;
...



下面的一些信息说明为什么在您的方案中使用start命令参数会适得其反。

使用cmd.exe(或从控制台或批处理文件)执行控制台应用程序(例如lame.exe)通常会阻塞cmd.exe(或控制台/批处理文件),直到控制台应用程序退出。

但是,使用start命令会将通常阻止控制台程序执行的操作转换为非阻止执行。 使用此参数,在控制台应用程序仍在运行时,cmd.exe(或控制台/批处理文件)将继续执行。 在您的特定情况下,这意味着cmd.exe将在启动lame.exe之后立即退出(因为它没有其他要执行的操作),从而有效地破坏了您等待lame.exe完成的尝试。

编辑:

根据下面的评论,我必须明确指出,我建议的原始解决方案不检查文件是否空闲,而是仅检查文件是否存在 因此,我建议以下内容:

private bool IsBusy(FileInfo file)
{
    FileStream stream = null;

    try
    {
        stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.None);
    }
    catch ()
    {
        return true;
    }
    finally
    {
        if (stream != null)
            stream.Close();
    }
    return false;
}

用法将是:

while(IsBusy(fileinfo))
{
     //just wait
}

原文:您可以使用while循环来查找文件准备就绪的时间:

while(!File.Exists(mp3FileName))
{
     //just wait
}
// add the attachment here
1 在命令提示符(cmd)中执行C#

Python允许以下操作:打开cmd后,我可以启动python,然后运行直接在cmd中返回结果的python命令。 例如,我输入print word而cmd返回word 。 C#是否有类似的东西,或者执行C#代码的唯一方法是将其写入文件然后进行编译? ...

3 如何使用c#操作命令提示符?

我创建了一个“hello.py”文件并将它放在与我的 c# .exe 相同的目录中我通过 c# 在命令提示符下运行它,这是我到目前为止的进展 但是当我运行它时,输出结果是 Microsoft Windows [版本 10.0.19041.685] (c) 2020 年微软公司。 版权所有 ...

4 如何在UNIX上执行Java命令提示符操作

我有两个名为test1.jar和test2.jar的jar文件。 为了在此jar文件中执行功能,我在cmd中的命令下面运行。 “ java getOutput参数1参数2参数3参数4” 作为前提,我已经在系统环境变量中设置了以下条目,以使用上述命令执行java函数。 1.CLAS ...

5 我应该如何在命令提示符下执行此操作?

我在 python 中制作了一个使用命令提示符的文件管理器代码,我通过将它移动到我的 C:/Users/Username 文件夹并复制我的下载文件夹(这是我想要排序的)来让它工作,但是当我输入时 它说没有名为 file_organizer.py 的文件。 但是现在当我将程序移动到 C:\\ 时, ...

6 在C#中通过命令提示符在远程计算机上执行命令

我希望能够在远程服务器上执行命令提示符,并且需要在控制台中发出多个命令并捕获输出-我想将该输出返回给我。 看起来就像是如何在本地执行命令提示符(不添加我希望在控制台中运行的命令。)昨天我在SO上的某个地方阅读了有关如何执行该部分的信息。 现在我想做的是打开远程计算机上的命令提示符,在控制 ...

7 如何使用c#在命令提示符中执行命令

我想用c#在CMD中执行这些步骤 1 - CD C:\\ MySQL \\ MySQL Server 5.0 \\ bin 2 - mysqldump -uroot -ppassword示例> d:\\ Test \\ 222.sql 在手动执行此操作时,我将获得名为“2 ...

2010-05-10 09:00:19 3 7253   c#
10 使用C#在提升的命令提示符中依次编写和执行多行

我是C#的新手,我有3个命令(command2,command3和command4),我需要在提升的命令提示符下执行,我也想查看执行过程。 当前,问题在于下面的代码仅打开提升的命令提示符,而没有执行命令。 如果错误,我也希望对这些行进行更好的解释。 我的代码以及基于类似案例的评论的每一 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM