在编写BAT脚本的过程中经常遇到类似这样的需求:
动态生成一个VBS脚本或PowerShell脚本,并在后续的BAT代码里面进行调用。
动态生成一个SQL文件,并在后续的BAT代码里面连接到数据库再执行它。
动态生成一个BAT脚本,并在后续的BAT代码里面连接远程Windows服务器再执行它。
动态生成一个Shell脚本,并在后续的BAT代码里面连接远程Linux服务器再执行它。
动态生成一个配置文件,并在后续的BAT代码里面进行软件的自动化静默安装。
当需要生成的文本内容比较简单的时候,可以直接使用 echo 命令重定向来实现,例如:
@echooff
> SubScript.vbsechomsgbox "bbs"
>>SubScript.vbsechomsgbox "bathome"
>>SubScript.vbsechomsgbox "net"
这里有个小技巧,把多次重定向写入文件的操作合并成一次操作,可以提高代码执行效率,例如:
@echooff
>SubScript.vbs (
echomsgbox "bbs"
echomsgbox "bathome"
echomsgbox "net"
)
使用 echo 命令重定向这个方案有一个问题需要注意,如果待生成的文本内容包含百分号、大于号、小于号、管道符号以及其它特殊字符的时候,需要进行转义。其中,百分号使用 % 进行转义,其它特殊字符使用 ^ 进行转义:
@echooff
> SubScript.batechoecho bbs ^|msg %%username%% /time:2
>>SubScript.batechoecho bathome ^|msg %%username%% /time:2
>>SubScript.batechoecho net ^|msg %%username%% /time:2
如果需要动态生成的文本内容比较长,尤其是包含很多特殊字符的情况下,使用 echo 命令重定向这种方案会比较麻烦,而且也不利于代码的后期维护。可以使用另外一个方案来实现这个功能:
@echooff
for/f"delims=:"%%i in('findstr /n "^:DynamicScript$" "%~f0"')do(
more+%%i"%~f0">SubScript.bat
)
goto:eof
REM 请确保待生成的文本位于脚本的末尾
:DynamicScript
@echo off
echo bbs | msg %username% /time:2
echo bathome | msg %username% /time:2
echo net | msg %username% /time:2
代码的思路是,把待生成的文本放到一个指定的标签下面,用 findstr 命令获取这个标签在该脚本的第几行,再用 more 命令把该行下面的内容重定向输出到文件。
领取专属 10元无门槛券
私享最新 技术干货