0

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

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 

其余部分未打印。

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

4

1 回答 1

0

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

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

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

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

如果在双引号字符串中找不到并且不使用延迟的环境变量扩展,则截断的原因>被解释为命令重定向运算符。

因此这里需要使用延迟扩展来回显包含对 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

请参阅为什么在命令行上使用“set var = text”后没有字符串输出和“echo %var%”?为什么使用set "variable=value". 第一个双引号位于变量名的左侧,而不是等号的右侧。正如引用的答案详细解释的那样,这有很大的不同。

删除每个重定向运算符左侧的空格字符,>>以避免将每行的尾随空格写入文本文件。每个重定向运算符的空格字符右侧>>无关紧要,但在这里也被删除了。

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

于 2016-11-06T09:13:43.063 回答