我正在尝试解析多行输出,但遇到了一些问题。我正在尝试编写一个脚本,该脚本将执行“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 文件名>不同
- 只有在<路径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%)
[坏信息 - 不真实]第二个问题是字符串替换似乎对变量不起作用(如果我错了,请纠正我).. 有办法解决这个问题,具体取决于您的使用情况。
[新信息 - 应该是真的] 看来你现在可以使用变量进行替换了.. 但事实并非如此习惯工作..所以这应该可以为你做到。:)