为什么IBM Tivoli Netcool Omnibus的摘要没有完整打印?

时间:2016-11-05 18:06:23

标签: batch-file escaping monitoring tivoli gitlab-omnibus

我需要帮助来打印综合“摘要”字符串。我有一个执行程序的触发器:

begin

for each row critical in alerts.status where critical.AlertKey = 'DISK_USAGE_CRIT'          
begin
execute send_email( critical.Node, critical.Severity, critical.AlertKey, 'NetcoolEmail', critical.Summary, 'WINITMSVR631');
end;
end

该触发器将关键节点,严重性,警报键,“NetcoolEmail”,摘要和主机名的值作为参数传递给名为send_email的过程。

这是程序正文:

(node char(1), severity int, situation char(1), email char(1), summary char(1), hostname (1)).

然后,此过程将这些参数的值传递给批处理文件中的变量。

set node=%1
set situation=%3
set summary=%5
echo %node% >> C:\IBM\logtest.txt
echo %situation% >> C:\IBM\logtest.txt
echo %summary% >> C:\IBM\logtest.txt

当我回显所有变量并将它们重定向到文本文件时,summary字符串会被截断,而其他字符串会按预期打印。

这是摘要变量在完全打印时的外观:

DISK_USAGE_CRIT[(%_Used>=1 AND WTLOGCLDSK.INSTCNAME AND Disk_Name="C:" ) ON Primary:WINSVR2K8:NT ON C: (%_Used=41 Disk_Name=C: )]

然而,它的打印方式如下:

DISK_USAGE_CRIT[(%_Used 

其余部分没有打印出来。

为什么摘要字符串不能完全输出?

1 个答案:

答案 0 :(得分:0)

字符串中的每个百分号%应该在命令过程中被解释为文字字符而不是环境变量引用的开头/结尾必须加倍。

但是如果摘要字符串作为:

传递给批处理文件
"DISK_USAGE_CRIT[(%_Used>=1 AND WTLOGCLDSK.INSTCNAME AND Disk_Name="C:" ) ON Primary:WINSVR2K8:NT ON C: (%_Used=41 Disk_Name=C: )]"

在开头使用双引号,在结尾使用双引号作为最后一个参数,如果在批处理文件中使用额外延迟的环境变量扩展,则不必将每个%替换为%%

如果在双引号字符串中找不到并且未使用延迟环境变量扩展,则截断的原因是>被解释为command redirection operator

因此,这里需要使用延迟扩展来回显包含对Windows命令解释器具有特殊含义的字符的环境变量的值。

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "node=%~1"
set "situation=%~3"
set "summary=%~5"
echo !node!>>C:\IBM\logtest.txt
echo !situation!>>C:\IBM\logtest.txt
echo !summary!>>C:\IBM\logtest.txt
endlocal

请参阅Why is no string output with 'echo %var%' after using 'set var = text' on command line?上的答案,了解使用set "variable=value"的原因。第一个双引号留给变量名称而不是等号右边。这引起了很大的不同,因为参考的答案详细解释了。

删除每个重定向运算符>>左侧的空格字符,以避免在每行上将尾随空格写入文本文件。每个重定向操作符>>的空格字符权限无关紧要,但在此处也会被删除。

有关延迟环境变量扩展的更多信息,请打开命令提示符窗口,运行set /?并仔细阅读此命令的所有输出帮助页面。