需要澄清批处理文件中管道在特定上下文中的使用

时间:2013-09-16 22:58:35

标签: batch-file pipe

我正在研究NSCA,将来自远程机器和应用程序的被动警报和检查与Nagios集成。在互联网上,我找到了批处理文件代码的一部分,可以帮助执行它。但是我不明白在最后一行使用管道。我知道管道是如何工作的但是我看不出输出回显%1;%2;%3;“%4”将如何用作值的输入%NSCA_BIN%-H%NSCA_SERVER%-p 5667 -to 10 -c %NSCA_CFG%-d; 。

set NSCA_HOME="D:\Nagios\BIN\GATEWAY"
set NSCA_BIN=%NSCA_HOME%\send_nsca.exe
set NSCA_CFG=%NSCA_HOME%\send_nsca.cfg
set NSCA_SERVER="192.168.10.110"

echo %1;%2;%3;"%4" | %NSCA_BIN% -H %NSCA_SERVER% -p 5667 -to 10 -c %NSCA_CFG% -d ;

请告诉我澄清这一点(关于使用这种管道的含义)吗? 提前致谢

2 个答案:

答案 0 :(得分:0)

在这种情况下,从命令行运行时,D:\Nagios\BIN\GATEWAY\send_nsca.exe看起来像是来自用户的输入。此脚本使用%1 - %4中的值作为输入,就像用户键入它一样。

答案 1 :(得分:0)

变量%1 %2 %3 %4 是前四个空格在脚本命令行上提供的定界参数。

管道评估后的部分:

D:\Nagios\BIN\GATEWAY\send_nsca.exe -H 192.168.10.110 -p 5667 -to 10 -c D:\Nagios\BIN\GATEWAY\send_nsca.cfg -d ;

Documentation for send_nsca表示它从标准输入中获取数据,包括由标签分隔的Nagios服务主机,Nagios服务描述,状态编号和插件输出,或者用 -d 指定的分隔符开关。上面的命令将分隔符设置为;

管道前面的部分echo %1;%2;%3;"%4"采用四个命令行参数,用冒号分隔,引用最后一个,并将它们作为输入提供给 send_nsca 。这意味着你会像这样调用脚本:

scriptname.bat NagiosServiceHost NagiosServiceDescription StatusNumber PluginOutput

脚本的目的似乎是为您省去必须输入 send_nsca 的路径和所有命令行参数的麻烦,并简单地提供输入,这对您有用多次使用此命令。


但在我看来,批处理文件的编写方式存在错误。我在文档中看到的任何内容都没有指定输入的第四个字段(插件输出)需要引用,所以我认为引用%4 背后的想法是允许在命令上指定的插件输出包含空格的行。但是,这不起作用,因为批处理文件会将命令行中以空格分隔的标记分配给%#变量,因此%4 将仅包含第四个标记,以及跟随它后面的空格后的所有内容都将被忽略。

我认为应该取出引号,如果需要提供带空格的参数,请在调用批处理文件时在命令行中引用它,如下所示:

scriptname.bat NagiosServiceHost NagiosServiceDescription StatusNumber "Plugin Output With Spaces"

这会将%4 设置为"Plugin Output With Spaces"(是的,引号包含在变量的值中 - 这就是你想要的)。