我尝试解析git版本中的文件并对其状态采取措施
出于某种原因,在'if then goto'之后,循环不再继续,而没有进行分支测试
整个剧本:
@ECHO OFF
setlocal enabledelayedexpansion
SET max=10
set "TAB= "
REM parse N revision
FOR /f "delims=" %%a IN ('git rev-list --max-count=%max% HEAD') DO (
REM parse all modifs in this revision
ECHO Checking revision %%a
FOR /f "delims=" %%b IN ('git diff-tree --no-commit-id --name-status -r %%a') do (
rem echo b %%b
set string=%%b
rem echo string !string!
set status=!string:~0,1!
set filename=!string:~2!
echo %TAB%Filename: '!filename!'
echo %TAB%Status: !status!
IF "!status!"=="A" GOTO :CASE_A
IF "!status!"=="M" GOTO :CASE_M
IF "!status!"=="D" GOTO :CASE_D
:CASE_A
echo added
:CASE_M
echo modified
:CASE_D
echo deleted
############## LOOPS STOPS HERE ###############
)
)
解释:
git rev-list --max-count=%max% HEAD
返回包含修订哈希的2行
git diff-tree --no-commit-id --name-status -r %%a
将检查该修订版中的所有文件
例如:
A New Text Document.txt
M test.bat
如果有人知道如何解决这个问题,我会对这个问题感到震惊 感谢
答案 0 :(得分:2)
正如我的评论中所述,您无法在:Labels
循环结构中使用For
。
而只是使用带括号的块:
@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion
Set "Max=10"
Set "Tab= "
For /F "Delims=" %%A In ('git rev-list --max-count=%Max% HEAD') Do (
Echo Checking revision %%A
For /F "Delims=" %%B In ('git diff-tree --no-commit-id --name-status -r %%A') Do (
Set "String=%%~B"
Echo %Tab%FileName: '!String:~2!'
Echo %Tab%Status: !String:~,1!
If /I "!String:~,1!"=="A" (
Echo Added
)
If /I "!String:~,1!"=="M" (
Echo Modified
)
If /I "!String:~,1!"=="D" (
Echo Deleted
)
)
)
Pause
答案 1 :(得分:0)
@echo off
setlocal
set max=10
set "TAB= "
for /f "tokens=*" %%A in (
'git rev-list --max-count=%max% HEAD'
) do (
echo Checking revision %%A
for /f "tokens=1,*" %%B in (
'git diff-tree --no-commit-id --name-status -r %%A'
) do call :case_do "%%~B" "%%~C"
)
goto :case_done
:case_do
setlocal
set "status=%~1"
set "filename=%~2"
echo %TAB%Status: %status%
echo %TAB%Filename: '%filename%'
if "%status%" == "A" goto :case_A
if "%status%" == "M" goto :case_M
if "%status%" == "D" goto :case_D
goto :case_else
exit /b
:case_A
echo added
exit /b
:case_M
echo modified
exit /b
:case_D
echo deleted
exit /b
:case_else
echo fixme
exit /b
:case_done
基于案例理念。
for
循环将每个修订版本设为%%A
并打印出来。for
循环的状态为%%B
,文件名为%%C
。:case_do
和"%%~B"
作为参数调用标签"%%~C"
。setlocal
中使用了可选的:case_do
,以将设置变量保留为本地范围。status
被赋予第一个参数的值。filename
被赋予第二个参数的值。%status%
与每个A M D
进行比较,然后转到匹配的标签。A M D
中的任何一个,则会转到可选的:case_else
。for
循环中的调用者。for
循环完成后,goto :case_done
将结束该部分。在嵌套for
循环中设置的标记不应该进行变量替换
在问题中发布示例输出。
此代码示例中不需要延迟扩展。