标题: [文本处理] [已解决] 批处理中的stderr到stdout的重定向如何实现? [打印本页]
作者: kfc427 时间: 2009-5-14 09:55 标题: [已解决] 批处理中的stderr到stdout的重定向如何实现?
通过了解后知道在Linux上,把stderr重定向到stdout可以使用下面类似的语句:- ./net_confirm -version 2>&1 |grep version
复制代码
那请问在bat中实现的话是怎样的?- net_confirm.exe -version 2>&1 ^| find "version"
复制代码
这样我试过,不行。
希望高手能不吝赐教。小弟先谢过
[ 本帖最后由 kfc427 于 2009-5-15 12:55 编辑 ]
作者: kfc427 时间: 2009-5-14 10:20
不过我在如下批处理语句中实现了重定向到文件里- 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
只给半截代码,又不想提供涉及到的工具,很难帮你。
猜一个罢:- for /f "delims=" %%i in ('"net_confirm.exe -version 2>&1|find "version""') do echo %%i
- 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- @echo off
- REM ****************************************
- REM ** File Name : ProbeInfo.bat **
- REM ****************************************
-
- REM *** parameters check, just in the case of there are two parameters to process next ***
- if "%1" EQU "" (
- goto :endofargs
- ) else if "%2" EQU "" (
- goto :endofargs
- )
-
- REM *** set the path probes located and make the path to short format ***
- set ProbePath=%OMNIHOME%\probes\win32 *OMNIHOME = C:\Program Files\Omnibus\Teac*
- for %%x IN ("%ProbePath%") DO set ProbePath=%%~sx *将路径去空格*
-
- REM *** task specified ***
- if /i "%1" EQU "-version" (
- goto :versionQuery
- ) else if /i "%1" EQU "-buildNo" (
- goto :buildnoQuery
- ) else (
- goto :endofargs
- )
-
- REM *** version query section ***
- :versionQuery
- 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 (
- for /F "tokens=2" %%j IN ("%%i") DO echo %%j
- )
- goto :exit
-
- REM *** build number query section ***
- :buildnoQuery
- for /F "tokens=3" %%i IN ('%ProbePath%\%2 -version 2^>^&1 ^| find /V "Debug" ^| find "Release ID" ^| find /V "API"') DO echo %%i
- goto :exit
-
- :endofargs
- echo "Bad parameter, please input parameters correctly..."
- echo "1. ProbeInfo.bat -version PROBE_NAME"
- echo "2. ProbeInfo.bat -buildNo PROBE_NAME"
-
- :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 |