具有特殊字符的批处理串联字符串

时间:2012-02-09 14:48:09

标签: string batch-file dos concatenation

上下文

我用nmap检查了几台服务器,然后通过电子邮件发送结果。

我为每个服务器连接一个变量和新结果,并使用此代码连接每个端口(我删除了循环):

SET text=
SET text=!text!+"<h1>server %%i:</h1>
SET text=!text!+"Port %%a : %%b<br/>"
SET text=!text!+"<br/>"

我发送一封包含text变量的电子邮件。

电子邮件呈现:

server 2:

+Port 8443 : https-alt
+
+
server 3:

+Port 2103 : zephyr-clt
+Port 2105 : eklogin
+Port 2107 : msmq-mgmt
+Port 49155 : unknown
+
+

我尝试+但不起作用:

SET text=
SET text=!text! "<h1>server %%i:</h1>
SET text=!text! "Port %%a : %%b<br/>"
SET text=!text! "<br/>"

我尝试了几种不同的选择。

问题

如何连接我的text变量而不是丑陋的+

有效的答案

SET "text="
SET "text=!text! ^<h1^>server %%i^</h1^>^<br/^>"
SET "text=!text! Port %%a %%b^<br/^>"
SET "text=!text! ^<br/^>"
%blat% -server %server% -port %port% -f %from% -to %to% -html -s "Opened ports" -body "!text!"

2 个答案:

答案 0 :(得分:4)

你的问题背后的前提是有缺陷的。这两组代码都构建了一个保留了特殊字符的文本变量。一个人+,一个人没有。 +与批处理编程中的串联无关。它只是一个像任何其他人一样的角色。

保留特殊字符<>,因为您已将它们括在引号中。 (实际上,服务器行缺少结束语。但是CMD.EXE恰好是宽容的。为了清楚起见,你可能应该添加结束语。)

您不必担心!text!内现有的特殊字符,因为延迟扩展会保护特殊字符。如果您使用的是%text%,那么 将不得不担心该值中的特殊字符。

如果您担心文本是否符合预期,您应该查看文本变量的值,而不是邮件消息中的输出。添加调试代码,如

set text

echo text=[!text!]

到你的代码,看看它构建后的值。 (我添加了方括号,以便您可以看到尾随空格。)

+版本与您的电子邮件一起使用,而没有版本的版本与文本字符串的构建无关。它必须是在您构建文本之后发生的事情,这与处理邮件消息本身有关。

我不明白为什么您的文字中的引号没有出现在您的邮件中。在构建文本后,必须再次发生一些事情。

vulkanino提出了一种从文本中删除引号的方法,但他的解决方案过于复杂。事实上,他在答案的顶部有一个非常好的方法而且没有意识到 - 没有理由把它们放在那里。

SET "text="
SET "text=!text! <h1>server %%i:</h1>"
SET "text=!text! Port %%a : %%b<br/>"
SET "text=!text! <br/>"

注意变量名之前的开头引号。此表单将保留特殊字符,而不在值中包含引号。

保留值中没有引号的特殊字符的另一种方法是转义特殊字符。

SET text=
SET text=!text! ^<h1>server %%i:^</h1^>
SET text=!text! Port %%a : %%b^<br/^>
SET text=!text! ^<br/^>

我认为所引用的解决方案更好。

答案 1 :(得分:2)

set "str1=Hello"
set "str2=World"

set "str3=%str1%%str2%"
set "str4=%str1% %str2%"

输出:

HelloWorld
Hello World

它不起作用,因为你的字符串中有特殊字符(引号,&lt;,&gt;,\等)。 您必须使用引号“并使用以下代码删除引号:

:NOQUOTES
       SET _string=###%_string%###
       SET _string=%_string:"###=%
       SET _string=%_string:###"=%
       SET _string=%_string:###=%