Board logo

标题: [其他] for循环结果重定向到cscript脚本的有趣现象 [打印本页]

作者: amwfjhh    时间: 2019-6-13 11:36     标题: for循环结果重定向到cscript脚本的有趣现象

也许之前有人说过,刚发现,觉得蛮有意思的。
  1. @if (0)==(0) echo off
  2. pushd %~dp0
  3. prompt ~#:
  4. (
  5. (for /l %%i in (1 1 9) do (echo,%%i))
  6. for /l %%i in (11 1 19) do (echo,%%i)
  7. ) | findstr /v "~#" | findstr /v "^$" | cscript -nologo -e:jscript %~s0 RegQuery .*7
  8. pause
  9. exit /b
  10. @end
  11. var strContent = "";
  12. strContent = WScript.StdIn.ReadAll();
  13. //WScript.Echo(strContent);
  14. //WScript.Quit();
  15. var fun = WScript.Arguments(0);
  16. switch (fun){
  17. case "RegQuery":
  18. var arg = WScript.Arguments(1);
  19. RegQuery(arg);
  20. break;
  21. default:;
  22. }
  23. function RegQuery(str) {
  24. var oReg = new RegExp(str, "g");
  25. while ( (rst = oReg.exec(strContent)) != null ) {
  26. WScript.Echo(rst);
  27. }
  28. }
复制代码
目前发现的两个坑:
1. 两个顺序的for放到语句块内,不重定向输出与重定向输出是两个结果。
直接输出结果:

重定向后输出的结果(线性的输出变成循环嵌套了):

解决的办法是在一个for循环就占用一个语句块(外面再套一对括号)

2. 若不作特殊处理,重定向后的结果还包括控制台信息(甚至在运行代码时不应看到的部分)。
还是拿上面的举例,直接输出结果:

不作处理重定向后输出的结果(坦诚相待,我怎么转的都告诉你了……):

解决办法通过组建特定的控制台回显格式+findstr屏蔽无意义回显。

这样for循环的结果可直接被用于类似cscript中的精细化处理。

测试平台 : WIN10




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2