`

在程序里调用命令行程序

阅读更多
<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script> 在程序里调用命令行程序,一位cnblog的仁兄写的


process早就有办法了, 只不过我没有注意.

如调用一个命令行:"cmd /c dir c:\winnt"; 把结果放到一个字符串里.

ProcessStartInfopsi=newProcessStartInfo("cmd","/cdirc:\winnt");
psi.RedirectStandardOutput
=true;
psi.UseShellExecute
=false;
Processp
=Process.Start(psi);

output
=p.StandardOutput.ReadToEnd();
p.WaitForExit();
注意那个waitforexit()一定要放到readtoend之后. MSDN里这样说:


process组件通过管道与子进程通信。如果子进程写入管道的数据多得足以填满缓冲区,则子进程将一直会阻塞到父进程从管道读取数据时为止。如果应用程序将所有输出读取到标准错误和标准输出,则这会导致死锁。

意思就是: 如果waitforexit在前, 那么如果数据太多而超出缓冲期大小, 子程序就会等着消费者把数据读出来, 可是这时候由于waitforexit正在阻塞, 做为消费者的过程序readtoend无法执行, 因而导致了死锁.

除了上面的, 还可以用程序交互:

ProcessStartInfopsi=newProcessStartInfo("cmd");
psi.RedirectStandardOutput
=true;
psi.RedirectStandardInput
=true;
psi.UseShellExecute
=false;
Processp
=Process.Start(psi);

p.StandardInput.WriteLine(
@"dirc:\winnt");
p.StandardInput.WriteLine(
@"ver");
p.StandardInput.WriteLine(
@"exit");

output
=p.StandardOutput.ReadToEnd();
p.WaitForExit();

重定义了stdin, 执行cmd程序, 进入了命令行交互, 然后向标准输入里写若干个命令, 回车, 有意思, 执行了! 最后千万别忘记了用"exit"命令中断cmd的执行, 不然后面的readtoend时, 永远也不会读到END, 程序又阻塞在这里不会退出.


最后, MSDN提到了standarderror, 如果同时重定向了stdout和stderr, 那么不当的方式也会出现死锁: 如:
stringoutput=p.StandardOutput.ReadToEnd();
stringerror=p.StandardError.ReadToEnd();
p.WaitForExit();

MSDN说程序先读了stdout, 完了之后再读stderr, 如果子进程在执行时向stderr写了内容, 那么就会死锁. 我想了一会儿, 没想明白. 如果程序在两个流里都写入了, 那么第一个读stdout的动作完成之前, stderror的内容留着不就行了? 但是没有时间试了.
MSDN建议用两个线程来处理不同重定向流. 这是个好办法.
分享到:
评论

相关推荐

    MFC Windows 程序设计之命令行接口调用

    MFC Windows 程序设计之命令行接口调用,适合初学MFC的小伙伴学习研究,博客中有对应的讲解和演示,避免走弯路,费时费力。也真心希望能够帮助正在苦学MFC Windows 程序设计的小伙伴们,你们的成长是我最大的幸福。

    Java调用命令行!

    在Java编程中,调用命令行是常见的任务之一,它允许开发者执行系统级别的操作,如运行外部程序、管理系统资源或进行文件操作。本篇将详细讲解如何在Java中调用命令行,以及相关的知识点。 首先,Java通过`Runtime`...

    C#调用命令行Demo

    本示例“C#调用命令行Demo”聚焦于如何在C#程序中通过命令行接口(CLI)执行外部命令。这在很多场景下非常有用,比如自动化任务、系统管理或与操作系统进行交互。 在C#中,我们可以通过`System.Diagnostics`命名...

    Loadrunner加载DLL和调用命令行程序的方法.pdf

    在 Loadrunner 中,我们可以加载 DLL 文件和调用命令行程序,以满足不同的测试需求。 加载 DLL 文件 Loadrunner 支持加载 DLL 文件,以便在脚本中使用 DLL 中的函数。这可以扩展 Loadrunner 的功能,并实现更多的...

    VB程序接收命令行参数

    在VB(Visual Basic)编程环境中,程序通常通过用户界面与用户交互,但有时我们需要让程序在没有用户界面或者从命令行直接启动时接收参数。这就是VB程序接收命令行参数的功能。这种功能允许开发者在启动VB应用程序时...

    Loadrunner加载DLL和调用命令行程序的方法.docx

    在 Loadrunner 中,我们可以加载外部的 DLL 文件,以便调用其中的函数,或者调用命令行程序,以实现更多的功能。下面我们将详细介绍 Loadrunner 中加载 DLL 和调用命令行程序的方法。 一、Loadrunner 中加载 DLL 的...

    网页采用命令行方式调用exe

    这个模块提供了子进程通信的能力,可以调用命令行程序。以下是一个基本用法: ```javascript const { exec } = require('child_process'); exec('C:\\path\\to\\your\\exe.exe', (error, stdout, stderr) =&gt; { if ...

    java调用命令行启动tomcat

    然而,在某些特定场景下,例如自动化部署或者集成测试过程中,我们需要通过程序代码(如Java)来调用命令行启动Tomcat。这种方式更加灵活,可以更好地融入自动化流程中。 #### 二、准备工作 在进行Java调用命令行...

    C#调用命令行代码进行关机

    通过了解和掌握这些知识,开发者不仅可以实现标题中所述的快速关机功能,还可以进一步探索如何利用C#调用命令行执行其他系统级任务,提升应用程序的功能和灵活性。当然,使用命令行时需谨慎,因为不恰当的操作可能会...

    C++编写的压缩解压缩程序(调用WinRAR的命令行程序)

    首先,我们来看标题“C++编写的压缩解压缩程序(调用WinRAR的命令行程序)”。这个程序是用C++语言编写的,C++是一种强大的、面向对象的编程语言,它具有高度的灵活性和性能,因此被广泛用于系统级编程和高性能计算...

    DialogShowCmd&#40;对话框调用命令行&#41;

    "DialogShowCmd(对话框调用命令行)" 是一个示例程序,它的主要功能是在一个对话框界面中调用操作系统命令行(CMD)执行特定的命令,并展示命令的输出结果。 **描述分析:** 描述中提到这是一个参考网络资料编写的...

    C#调用cmd命令行设置命令 并获取返回的数据

    在.NET框架中,C#语言提供了丰富的功能来与操作系统进行交互,其中之一就是通过调用CMD命令行来执行系统级别的操作。本主题将深入探讨如何在C#中调用CMD命令行,设置命令,并获取返回的数据。 首先,我们需要了解C#...

    Java简单实现调用命令行并获取执行结果示例

    Java命令行调用及执行结果获取技术详解 ...本文详细介绍了Java简单实现调用命令行并获取执行结果示例,包括命令行调用技术、执行结果获取技术、异常处理等方面的知识点,希望对大家Java程序设计有所帮助。

    VB 获取程序运行的命令行

    在编程领域,尤其是在Visual Basic (VB)环境中,有时我们需要获取程序运行时的命令行参数,以便根据外部调用的方式执行不同的操作。`VB 获取程序运行的命令行`这个主题涉及到了如何从VB程序中捕获启动时传递的命令行...

    简单VC++调用命令行重建WMI DB

    本文将详细介绍如何使用VC++编写一个简单的程序来调用命令行工具来重建WMI数据库,并涉及重启服务、删除文件以及刷新防火墙记录等相关操作。 首先,我们要知道如何在命令行中执行重建WMI数据库的操作。这通常涉及到...

    四种方法用python调用命令行

    四种方法用python调用命令行 1.os.system import os a=os.system&#40;ls&#41; a 运行程序会显示输出,返回值a为程序退出码 2.os.popen import os a=os.popen(ls) a.readline() 返回值为一个file文件, file....

    qt调用cmd命令和dll例子

    这些知识点在Windows操作系统下的程序开发中尤为常见,因为CMD是系统内置的命令行工具,而DLL则允许共享代码和资源,减少内存占用。 首先,让我们深入理解如何在Qt中调用CMD命令。在Qt中,我们可以使用QProcess类来...

    C语言使用win32API调用命令行命令进行FTP上传下载

    本文将深入探讨如何利用C语言结合Win32 API调用命令行命令,从而实现FTP(文件传输协议)的上传和下载。 FTP是Internet上常用的一种服务,用于在客户端和服务器之间传输文件。在C语言中,我们可以使用Win32 API的...

    VB使用命令行启动外部程序

    在VB(Visual Basic)编程中,启动外部程序是常见的任务,尤其在自动...总的来说,VB通过命令行启动外部程序是通过调用Shell函数或利用.NET的Process类实现的,理解其工作原理和注意点,将有助于在实际开发中灵活运用。

    C#调用cmd命令管理wifi小工具(附带源码)

    这个标题表明,这是一个使用C#编程语言开发的小型应用程序,它的主要功能是通过调用操作系统的命令行工具(cmd)来管理和控制笔记本电脑上的内置无线网络连接,即WiFi。这种工具在日常使用中非常实用,特别是对于...

Global site tag (gtag.js) - Google Analytics