Board logo

标题: [文本处理] [已解决] 批处理中的stderr到stdout的重定向如何实现? [打印本页]

作者: kfc427    时间: 2009-5-14 09:55     标题: [已解决] 批处理中的stderr到stdout的重定向如何实现?

通过了解后知道在Linux上,把stderr重定向到stdout可以使用下面类似的语句:
  1. ./net_confirm -version 2>&1 |grep version
复制代码
那请问在bat中实现的话是怎样的?
  1. net_confirm.exe -version 2>&1 ^| find "version"
复制代码
这样我试过,不行。
希望高手能不吝赐教。小弟先谢过

[ 本帖最后由 kfc427 于 2009-5-15 12:55 编辑 ]
作者: kfc427    时间: 2009-5-14 10:20

不过我在如下批处理语句中实现了重定向到文件里
  1. net_confirm.exe -version > tmp.txt 2>&1
复制代码
至于管道重定向我是不知道如何实现...
作者: cutebe    时间: 2009-5-14 10:21

不知道 net_confirm.exe 是什么命令。

但可以试下,把 ^ 这个符号去掉。
作者: kfc427    时间: 2009-5-14 10:24

原帖由 cutebe 于 2009-5-14 10:21 发表
不知道 net_confirm.exe 是什么命令。

但可以试下,把 ^ 这个符号去掉。

net_confirm.exe是一个别人开发出来的产品,能实现对网络某节点的确认。而
net_confirm.exe -version
可以得到这个产品相关的版本号,版权声明之类的信息
作者: kfc427    时间: 2009-5-14 10:27

原帖由 cutebe 于 2009-5-14 10:21 发表
不知道 net_confirm.exe 是什么命令。

但可以试下,把 ^ 这个符号去掉。

我这语句是要放到for语句里嵌套使用的
我认为这时的管道符应该是 "^|" 这个吧?
作者: cutebe    时间: 2009-5-14 10:57

不如共享一下,大家帮你测试。
作者: Batcher    时间: 2009-5-14 11:39

没有net_confirm.exe不好做测试,arp是没有问题的。

C:\Test>arp 2>&1|find "IP-to-Physical"
Displays and modifies the IP-to-Physical address translation tables used by

作者: sylovanas    时间: 2009-5-14 15:01

for /f "delims=" %%a in ('net_confirm.exe -version 2^>^&1 ^| find "version"') do @echo %%a

还是

for %%a in (abc) do net_confirm.exe -version 2>&1 ^| find "version" ?

后者^要去掉

[ 本帖最后由 sylovanas 于 2009-5-14 15:03 编辑 ]
作者: cutebe    时间: 2009-5-14 16:51

只给半截代码,又不想提供涉及到的工具,很难帮你。

猜一个罢:
  1. for /f "delims=" %%i in ('"net_confirm.exe -version 2>&1|find "version""') do echo %%i
  2. pause
复制代码

作者: Batcher    时间: 2009-5-14 17:54     标题: 回复 9楼 的帖子

你猜的不对,特殊字符需要转义,见8楼。
作者: kfc427    时间: 2009-5-14 20:33

原帖由 cutebe 于 2009-5-14 16:51 发表
只给半截代码,又不想提供涉及到的工具,很难帮你。

猜一个罢:for /f "delims=" %%i in ('"net_confirm.exe -version 2>&1|find "version""') do echo %%i
pause

不是不想把那东西贴出来,关键是有好多东西,动态链接库就用到20来个!
作者: wxcute    时间: 2009-5-14 20:40

没有实物真的是很难想。

放在哪个地方,提供一个下载地址罢。
作者: Batcher    时间: 2009-5-14 21:36     标题: 回复 11楼 的帖子

那就把你的完整代码贴出来看看吧
作者: kfc427    时间: 2009-5-14 22:49

问题解决喽!
一会把代码贴上来给大家看看
以答谢大家对我的帮助
作者: kfc427    时间: 2009-5-14 23:02

Netcool/OMNIbus MT Ping Probe - Version 7.2.1
(C) Copyright IBM Corp. 1994, 2007

5/16/2009 10:58:09 PM: Debug: D-UNK-105-000: Netcool/OMNIbus Probe API Library Version 7.2.1
5/16/2009 10:58:09 PM: Debug: D-UNK-105-000: API Release ID: 5.11.18
5/16/2009 10:58:09 PM: Debug: D-ETC-105-001: Added property SSLServerCommonName
5/16/2009 10:58:09 PM: Debug: D-ETC-105-001: Added property ServerBackup
Netcool/OMNIbus Ping probe - Version 7.2.1
(C) Copyright IBM Corp. 1994, 2007

Netcool/OMNIbus Probe API Library Version 7.2.1
Release ID: 4.0.3261
API Release ID: 5.11.18
  1. @echo off
  2. REM ****************************************
  3. REM ** File Name : ProbeInfo.bat          **
  4. REM ****************************************
  5. REM *** parameters check, just in the case of there are two parameters to process next ***
  6. if "%1" EQU "" (
  7.         goto :endofargs
  8. ) else if "%2" EQU "" (
  9.         goto :endofargs
  10. )
  11. REM *** set the path probes located and make the path to short format ***
  12. set ProbePath=%OMNIHOME%\probes\win32               *OMNIHOME = C:\Program Files\Omnibus\Teac*
  13. for %%x IN ("%ProbePath%") DO set ProbePath=%%~sx   *将路径去空格*
  14. REM *** task specified ***
  15. if /i "%1" EQU "-version" (
  16.          goto :versionQuery
  17. ) else if /i "%1" EQU "-buildNo" (
  18.          goto :buildnoQuery
  19. ) else (
  20.          goto :endofargs
  21. )
  22. REM *** version query section ***
  23. :versionQuery
  24. for /F "delims=- tokens=2" %%i IN ('%ProbePath%\%2 -version 2^>^&1 ^| find /V "Debug" ^| find /I "probe" ^| find /V "API" ^| find /V " MT "') DO (
  25. for /F "tokens=2" %%j IN ("%%i") DO echo %%j
  26. )
  27. goto :exit
  28. REM *** build number query section ***
  29. :buildnoQuery
  30. for /F "tokens=3" %%i IN ('%ProbePath%\%2 -version 2^>^&1 ^| find /V "Debug" ^| find "Release ID" ^| find /V "API"') DO echo %%i
  31. goto :exit
  32. :endofargs
  33. echo "Bad parameter, please input parameters correctly..."
  34. echo "1. ProbeInfo.bat -version PROBE_NAME"
  35. echo "2. ProbeInfo.bat -buildNo PROBE_NAME"
  36. :exit
复制代码
此脚本是用来获取回显(类似于代码上面的东西)中的特定内容的,而这个回显的输出是标准错误输出;所以需要用到输出的重定向。至于执行文件的路径中有空格的问题,加双引号的方法试过了(加什么位置都试过),可都是以失败告终。最终我采纳了另一方法,将路径短化、去空格化。
最终就解决了。
作者: everest79    时间: 2009-5-15 00:11

没看懂strerr跟stout都是标准输出,而管道符"|"本来就是传递标准输出的内容给接收端,干吗要分err与out?
作者: kfc427    时间: 2009-5-15 09:49

原帖由 everest79 于 2009-5-15 00:11 发表
没看懂strerr跟stout都是标准输出,而管道符"|"本来就是传递标准输出的内容给接收端,干吗要分err与out?

管道符的默认输出是stdout的,而我程序中用的回显却是用的stderr。
所以需要一个输出重置
作者: everest79    时间: 2009-5-15 14:06

我错了,原来的确是分离的

你没办法自定义句柄是因为运算符优先级,将句柄转向应用到当前命令行了
使用

(abc.exe 2>&1)|find
这样试试




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