Git 批处理脚本-FOR循环在IF测试时停止
我试图解析git修订版中的文件,并根据它们的状态采取行动 由于某种原因,在我的“if-then-goto”之后,循环不再继续,而没有分支测试 整个剧本:Git 批处理脚本-FOR循环在IF测试时停止,git,batch-file,Git,Batch File,我试图解析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 pars
@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
如果有人知道如何解决这个问题的话,我会绞尽脑汁来解决这个问题
谢谢正如我在评论中提到的,您不能在循环构造的
中使用:Labels
相反,只需使用括号中的块:
@Echo关闭
SetLocal EnableExtensions EnableDelayedExpansion
设置“最大值=10”
设置“Tab=”
对于/F“Delims=“%%A In('git rev list--max count=%max%HEAD'),请执行以下操作:(
回显检查版本%%A
对于/F“Delims=“%%B In('git diff tree--no commit id--name status-r%%A')Do(
设置“字符串=%%~B”
回显%Tab%FileName:'!字符串:~2!'
回显%Tab%状态:!字符串:~,1!
如果/I“!字符串:~,1!”==“A”(
回声补充道
)
如果/I“!字符串:~,1!”=“M”(
回声修正
)
如果/I“!字符串:~,1!”=“D”(
回音删除
)
)
)
暂停
基于案例理念
第1个for
循环将每个修订获取为%%A
,并将其打印出来
嵌套的for
循环的状态为%%B
,文件名为%%C
Label:case\u do
以“%%B”
和“%%C”
作为参数调用
可选的setlocal
用于label:case\u do
将设置的变量保留为本地范围
状态
被分配第一个参数的值
filename
被分配第二个参数的值
打印两个变量的名称和值
将%status%
与每个A M D
进行比较,并转到匹配项的标签
如果没有任何md
,则转到可选的:case\u else
当案例结束时,执行返回到for
循环中的调用者
一旦
的循环完成,goto:case_done
将结束该部分
在嵌套的for
循环中,作为标记设置的变量替换不应该是好的
使用问题中发布的示例输出
此代码示例中不需要延迟扩展。您的问题似乎是因为您在For
循环构造的中使用了:标签,这是您无法做到的!即使标签不在循环中,代码也不会按预期工作,因为1。你不处理不匹配的情况,和2。执行从一个标签部分落到下一个标签部分,因为您没有离开它们(请注意,对于批处理文件,命令会一个接一个地执行,除非您明确指示不要这样做)。
@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