搜索
查看: 1861|回复: 8

通过process.popen执行cmd会卡在findstr窗口

[复制链接]

10

主题

88

帖子

509

积分

三级会员

Rank: 4

积分
509
发表于 2017-11-24 09:44:29 | 显示全部楼层 |阅读模式

手动在cmd中执行echo "123456"  | findstr /c:"1" >nil && echo 1 || echo 0
能够得到返回值1,使用process.popen调用cmd,卡在findstr的弹出窗口,窗口标题是findstr /c:"1"
不知道有没有什么好的解决办法?

  1. import process.popen

  2. cmd=/*
  3.         echo "123456"  | findstr /c:"1" >nil && echo 1 || echo 0
  4. */

  5. io.open()
  6. prcs = process.popen("cmd.exe")

  7. prcs.write(cmd)
  8. result = prcs.peekTo(">");
  9. prcs.write('exit\n')
  10. io.print(result)

  11. execute("pause") //按任意键继续
  12. io.close();//关闭控制台
复制代码
~什么都会点,什么都不会~
回复

使用道具 举报

10

主题

88

帖子

509

积分

三级会员

Rank: 4

积分
509
 楼主| 发表于 2017-11-24 10:06:24 | 显示全部楼层
试了下execute(cmd)是能够正常执行的,不过execute只执行第一行命令,所以需要将所有命令写成一行,稍有不便
  1. import process.popen

  2. cmd=/*
  3. @set str="123456" && echo %str%| findstr.exe /c:"11" >nil && echo 1 || echo 0
  4. */
  5. io.open()

  6. execute(cmd)
  7. execute("pause") //按任意键继续
  8. io.close();//关闭控制台
复制代码
~什么都会点,什么都不会~
回复

使用道具 举报

10

主题

88

帖子

509

积分

三级会员

Rank: 4

积分
509
 楼主| 发表于 2017-11-24 10:30:26 | 显示全部楼层
使用excute暂时解决了
我这经常1.6,1。7和1.8切换,所以写了个jdk配置脚本,源码如下:
  1. import console;
  2. import fsys;
  3. import fsys.environment;
  4. import table;
  5. import process.popen

  6. JAVA_HOME = /**
  7.         @SETX /M JAVA_HOME "JDKPATH" &&        SET JAVA_HOME="JDKPATH"
  8. **/
  9. ClassPath = /**
  10.         @SETX /M ClassPath ".;JDKPATH\lib;JDKPATH\lib\tools.jar" &&        SET ClassPath=".;JDKPATH\lib;JDKPATH\lib\tools.jar"
  11. **/

  12. path = /**
  13.         @echo %path% | findstr /c:"jdk" >nul || SETX /M Path %"JAVA_HOME"%"\bin;%Path%" && SET Path=%"JAVA_HOME"%"\bin;%Path%"
  14. **/


  15. console.log('jdk环境变量设置!\r\n\r\n')
  16. tab={}
  17. addTable=function(pg){
  18.         fsys.enum(pg+"/Java","jdk1.*",
  19.                         function(dir,filename,fullpath,findData){ //指定触发器
  20.                                 if(!filename){
  21.                                         table.insert(tab,fullpath)
  22.                                 }
  23.                         }
  24.                   );
  25. }
  26. addTable(fsys.environment.expand("%ProgramFiles%"));
  27. addTable(fsys.environment.expand("%ProgramW6432%"));

  28. for(k,v in tab) console.log("",k,v);

  29. var num = console.getNumber('\r\n\r\n输入对应的数值:')
  30. prcs = process.popen("cmd.exe","/max")
  31. if(tonumber(num)<=table.len(tab)){
  32.         //prcs.write(cmd)
  33.         //result = prcs.peekTo(">");
  34.         //prcs.write('exit\n')
  35.         execute(string.replace(JAVA_HOME,"@JDKPATH",tab[num]))
  36.         execute(string.replace(ClassPath,"@JDKPATH",tab[num]))
  37.         execute(path)
  38.         console.box(,,26,4,11,"已完成设置!" )
  39. }else {
  40.         console.log('输入错误!')
  41. }

  42. console.pause()

复制代码
~什么都会点,什么都不会~
回复

使用道具 举报

12

主题

679

帖子

4008

积分

荣誉会员

子非魚、安知魚之樂

Rank: 8Rank: 8

积分
4008
发表于 2017-11-24 11:56:58 | 显示全部楼层
win库有 getenv() 和 setenv()
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2017-11-24 12:31:01 | 显示全部楼层
即然你已经用process.popen重定向了cmd.exe的管道,
怎么又输入管道命令,这不自相矛盾吗,他当然傻掉了。

可以看看我写的 inet.stat ,如果通过管道得到了命令执行结果,已经捕获取了进程输出,可以直接编程处理字符串了。

另外你要设置JAVA_HOME,添加PATH这些环境变量,直接用 win.setenv,win.addenv 这些函数就可以了,不需要写这么复杂。
回复

使用道具 举报

10

主题

88

帖子

509

积分

三级会员

Rank: 4

积分
509
 楼主| 发表于 2017-11-29 14:58:39 | 显示全部楼层
xauto 发表于 2017-11-24 11:56
win库有 getenv() 和 setenv()

非常感谢!
~什么都会点,什么都不会~
回复

使用道具 举报

10

主题

88

帖子

509

积分

三级会员

Rank: 4

积分
509
 楼主| 发表于 2017-11-29 15:57:26 | 显示全部楼层
Jacen.He 发表于 2017-11-24 12:31
即然你已经用process.popen重定向了cmd.exe的管道,
怎么又输入管道命令,这不自相矛盾吗,他当然傻掉了。 ...

现在理解process.popen的用法了.
另外试了一下setenv和getenv,当前进程的环境变量设置和获取没问题,
只是没有找到永久生效的参数.
~什么都会点,什么都不会~
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2017-11-29 16:04:08 | 显示全部楼层
mzky 发表于 2017-11-29 15:57
现在理解process.popen的用法了.
另外试了一下setenv和getenv,当前进程的环境变量设置和获取没问题,
只 ...

一般改当前进程环境变量可以的话,系统变量最好不要去改。
改系统变量需要修改注册表,扩展库里有 environment 可以用。
回复

使用道具 举报

10

主题

88

帖子

509

积分

三级会员

Rank: 4

积分
509
 楼主| 发表于 2017-11-29 16:05:15 | 显示全部楼层
Jacen.He 发表于 2017-11-29 16:04
一般改当前进程环境变量可以的话,系统变量最好不要去改。
改系统变量需要修改注册表,扩展库里有 envir ...

好的,谢谢!
~什么都会点,什么都不会~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-12-15 22:56 , Processed in 0.062500 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表