批处理文件解析多行命令输出

批处理文件解析多行命令输出

我正在尝试解析多行输出,但遇到了一些问题。我正在尝试编写一个脚本,该脚本将执行“diff”命令并识别已修改或添加到核心项目的文件。该脚本接受 2 个输入参数,分别用于主存储库的顶层和已修改项目的顶层。代码如下:

for /f "delims=" %%a in ('diff -qr "%path1%" "%path2%"') do (
    SET output=%%a
    echo a:%%a
    echo output:%output%
    ...
)

我遇到的第一个问题是,它的输出是:

答:仅限<文件名>
输出:

SET 输出命令似乎没有为变量赋值。这使得处理输出变得很困难。我想要做的是将 diff 结果分成不同的列表。diff 实用程序生成 3 个可能的输出:

  1. 只有在<路径1 文件名>
  2. 文件<路径1 文件名><路径2 文件名>不同
  3. 只有在<路径2 文件名>

我试图识别输出字符串属于哪种类型的输出,然后仅删除 path1 文件的文件名,但我之前用于测试包含字符串的代码不适用于 %%a 变量;即

SET newFile=Only^ in^ 
if NOT "x%%a:%newFile%=%% == "x%%a%%" do ...

任何帮助都值得感激。谢谢

答案1

对于第一个问题,你会发现使用批处理更容易功能。您可以使用延迟扩展,但函数会使您的批处理更易于阅读和理解。

笔记,转到:EOF就像在其他语言中说“回归”一样。

代替:

for /f "delims=" %%a in ('diff -qr "%path1%" "%path2%"') do (
    SET output=%%a
    echo a:%%a
    echo output:%output%
    ...
   )

尝试:

for /f "delims=" %%a in ('diff -qr "%path1%" "%path2%"') do call :parse_results "%%a"
goto :EOF

:parse_results
Set output=%~1
echo a:%~1
echo output:%output%
goto :EOF

第二个问题不太容易......这里有两个问题......

我们上面解决的第一个问题是,你不能对 %%a 进行字符串替换,你需要一个完整的变量(又名 %output:old=new%)

[坏信息 - 不真实]第二个问题是字符串替换似乎对变量不起作用(如果我错了,请纠正我).. 有办法解决这个问题,具体取决于您的使用情况。

[新信息 - 应该是真的] 看来你现在可以使用变量进行替换了.. 但事实并非如此习惯工作..所以这应该可以为你做到。:)

相关内容