批处理 - 解析变量中的多行命令输出

Batch - parse multi-line command output in variable

我有一个批次用于 运行 多个 SQL 脚本并将它们的输出记录在一个文本文件中 (SQL_results.txt)。这是将 运行 脚本并在输出开始时检查结果错误的块(错误将始终在一行中,以 "Msg" 开头):

SQLCMD command_to_run_a_script > error.txt
set /p result=<error.txt
set result=%result:~0,3%
if ""%result%""==""Msg"" exit
type error.txt >> SQL_results.txt
del error.txt

值得注意的是,输出的行数是动态的,可能会超过可变字符限制,而且 "Msg..." 行可能并不总是第一行。

我试过这个来测试在变量中进行检查,但它只会为每一行写入输出的最后一行:

for /f "delims=" %%i in ('SQLCMD command_to_run_a_script') do (set VAR=%%i & ECHO %VAR%>> SQL_results.txt)

是否可以通过逐行解析结果来尝试在变量中找到以 "Msg" 开头的结果,而不是必须为每个脚本创建和删除文本文件来完成这样的事情?

由于一个变量只会包含一行,所以我不太清楚你的意图。

仅将有错误的行过滤到文件中:

SQLCMD command_to_run_a_script|Findstr "^MSG" > error.txt

将 MSG 行存储在数组中并在最后输出

@Echo off&Setlocal EnableDelayedExpansion
Set cnt=0
For /f "delims=" %%A in (
  'SQLCMD command_to_run_a_script ^|Findstr "^MSG" '
) Do (
  Set /A cnt+=1
  Set "MSG[!Cnt!]=%%A"
)
Echo had %cnt% MSG lines
For /l %%C in (1,1,%cnt%) Do Set MSG[%%C]