我用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!"
答案 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:###=%