zoukankan      html  css  js  c++  java
  • [转]Delphi执行CMD命令

    今天看到有人在问用代码执行CMD命令的问题,就总结一下用法,也算做个备忘。

    Delphi中,执行命令或者运行一个程序有2个函数,一个是winexec,一个是shellexecute。这两个大家应该都见过,其中,winexec比较简单,可以直接运行一个外部程序,shellexecute则更高级一些,除了可以运行外部exe,还可以执行特殊命令。

    下面我们就分别举例子说明:我们先来看看运行一个exe程序,以记事本为例:

    WinExec(PChar(' notepad .exe'),SW_NORMAL);//正常模式打开

    WinExec(PChar(' notepad .exe'),SW_HIDE);//隐藏方式打开

    WinExec(PChar('notepad.exe'),SW_SHOWMAXIMIZED);//最大化方式打开,软件必须支持最大化运行,否则该参数无效,以NORMAL方式运行

    WinExec(PChar('notepad.exe'),SW_SHOWMINIMIZED);//最小化方式打开

    Shellexecute(handle,nil,'notepad.exe',nil,nil,sw_normal);//这个是用shellexecute的方式打开,注意最后一个参数,和上面一样

    使用Shellexecute注意需要uses ShellApi,上面的记事本,因为是在系统目录下,所以可以直接写notepad.exe文件名,而不必写路径,如果是其他非环境变量中注册的exe,则需要带上绝对路径或者相对路径

    好,上面是最简单的,下面我们来说说带参数的运行,大家知道,有些exe程序在运行的时候可以附加参数,这里以cmd为例说明

    比如,我想运行ping命令,去执行ping 192.168.1.1

    WinExec(PChar( 'cmd.exe /c  ping 192.168.1.1'),SW_SHOWNORMAL);

    shellexecute(handle,nil,'cmd.exe',pchar('/c ping 192.168.1.1'),nil,sw_normal);

    注意,cmd的命令需要是用/c表示带参数运行,然后后面跟上具体命令,这样就可以执行ping命令了。

    上面的命令的确可以成功运行,但是有个缺点,那就是cmd在执行完毕后就会自动关闭窗口,如果有时候命令执行的过快,我们根本看不清结果,那么,有什么办法可以让cmd在执行完毕后不关闭窗口呢?答案是肯定的,我们需要一个额外的命令pause

     WinExec(PChar( 'cmd.exe /c  ping 192.168.1.1 & pause'),SW_SHOWNORMAL);

    我们注意红色部分,我们使用一个&符号和pause,pause是批处理中的暂停命令,&符号则表示可以执行多个命令,上面的例子就表明,在执行完ping命令后再执行pause命令,这样,窗口就不会关闭了。shellexecute同样支持该方法。

    下面,我们看看shellexecute其他的一些方法:

    打开网页:这个太简单了,大家应该都知道

     ShellExecute(handle, 'open', PChar('http://www.baidu.com'), nil, nil, SW_SHOWNORMAL);//使用默认浏览器打开baidu.com

     ShellExecute(handle, 'open', 'firefox.exe',PChar('http://www.baidu.com'),nil, SW_SHOWNORMAL);//使用火狐浏览器打开baidu.com

     当然,shellexecute还支持在系统中注册过的关联命令。比如发邮件

    ShellExecute(handle, 'open',PChar('mailto:123@123.com'),nil,nil, SW_SHOWNORMAL);

    执行这句就可以打开默认邮件客户端给123@123.com发邮件了,如果我们想带上主题和内容也很好办:

     ShellExecute(handle, 'open',PChar('mailto:123@123.com?subject=这是邮件主题&bcc=123@123.com&body=邮件正文'),nil,nil, SW_SHOWNORMAL);

    上面的就可以自动填写主题,内容和抄送了,注意,中文需要编码,否则可能出现乱码。

  • 相关阅读:
    进程、线程、协程
    C++内存模型
    动态库dll与静态库lib
    virtual 虚函数表
    C++面试随笔
    alloc()、malloc()、calloc()、realloc()区别及用法
    C/C++ 面试题记录
    VC底层钩子程序在Win7/Vista下无效
    JMeter安装之后修成中文版
    明天开始 新的旅程
  • 原文地址:https://www.cnblogs.com/go-jzg/p/4195748.html
Copyright © 2011-2022 走看看