【问题标题】:Why is IBM Tivoli Netcool Omnibus's Summary is not fully printed?为什么没有完全打印 IBM Tivoli Netcool Omnibus 的摘要?
【发布时间】:2016-11-05 18:06:22
【问题描述】:

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

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 

其余部分未打印。

为什么摘要字符串没有输出完整?

【问题讨论】:

  • %summary% 包含需要转义的字符,例如>
  • 你好大卫,有什么方法可以完全打印摘要吗?谢谢
  • 试试set summary="%5"
  • 你好大卫,我试过 set summary="%5" 然后它返回 "'DISK_USAGE_CRIT[(%_Used" 。谢谢你大卫

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


【解决方案1】:

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

但是如果将摘要字符串传递给批处理文件为:

"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 /? 并仔细阅读此命令的所有输出帮助页面。

【讨论】:

  • 你好 mofi,谢谢你的建议。我已经用你的代码更新了我的批次。但它也像之前一样返回值 'Primary:WINITMSVR631:NT' 'DISK_USAGE_CRIT' 'DISK_USAGE_CRIT[(%_Used 它仍然没有打印出摘要的所有正文。谢谢
  • 请验证您如何通过在顶部的批处理文件中使用@echo %* >>C:\IBM\logtest.txt 将摘要字符串传递给批处理文件。如果您没有将摘要字符串写入带有双引号的文本文件,那么您将错误地传递给批处理文件,很可能没有所需的双引号。
  • 你好 mofi,我已经成功传递字符串并将其打印到 logtest.txt。但是当我将摘要作为电子邮件的正文,然后使用 blat.exe 发送时,电子邮件没有被发送?是不是因为摘要太长了?谢谢莫菲
  • 好吧,blat.exe 必须以"!summary!" 作为参数调用。有必要再次用双引号将摘要字符串括起来。 blat.exe 如何解释这个带有双引号和内部双引号的参数字符串是不可预测的,并且取决于blat 使用的编译器的启动代码。有关内部带有双引号的参数字符串的不同解释的详细信息,请参阅this answer。最好在将摘要字符串传递给批处理文件之前用单引号替换所有双引号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 2013-06-20
  • 2017-02-10
  • 2017-08-08
相关资源
最近更新 更多