如果在LINUX下,这个文件很容易解决,直接在运行的程序命令后面加&就可以了,但翻遍WIN的CMD命令则没有发现有相关的选项,弄了一天也没什么结果,晚上下班回家,和同事边走边聊,告诉我WIN API中的CreateProcess可以解决该问题,于是回家继续翻出CPAN查找WIN32和API相关的模块,可惜的是WIN32和WIN32::API模块都没有该方法。
于是继续找,翻到了早上已经看过的Win32::Process
使用起来也很简单
Win32::Process::Create($ProcessObj,
"C:\\winnt\\system32\\notepad.exe",
"notepad temp.txt",
0,
NORMAL_PRIORITY_CLASS,
".")|| die ErrorReport();
执行该代码后跳出一个记事本出来,虽然满足了我运行程序的条件,但不能满足我集成的条件-不显示第三方的程序,于是详细看了下文档,文档中说create的第5个参数是可以指定的,于是立马找该参数的详细设定,找到一个CREATE_NO_WINDOW,顾名思义,就是创建的进程是没有窗口的,但是使用该参数还是必须要第三方程序运行完才能执行下面的代码,而CREATE_NEW_CONSOLE虽然可以在第三方程序运行时就继续执行下面的代码,但会开启一个新的窗口出来
其实不是不能用线程来解决,但因为该程序可能会不断的开启和关闭第三方的程序,而perl的线程处理如果不好,内存浪费是很严重的,所以还是看下有没更简单点的办法
继续往下看DETACHED_PROCESS,哈哈,看名字难道就是我要找的吗?
执行了一下,果然既不出第三方窗体,而且第三方程序运行的时候也会继续执行下面的代码
至此我要的功能完成
以下是我的测试代码,执行一个ping的命令并在命令还在运行的时候返回其PID
Win32::Process::Create($ProcessObj,
"C:\\WINDOWS\\system32\\ping.exe",
"ping 192.168.0.1",
0,DETACHED_PROCESS,".")|| die ErrorReport();
print $ProcessObj->GetProcessID();