BATCH脚本 - FOR循环在IF测试

时间:2018-06-08 11:57:00

标签: 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 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

如果有人知道如何解决这个问题,我会对这个问题感到震惊 感谢

2 个答案:

答案 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

基于案例理念。

  1. 第一个for循环将每个修订版本设为%%A并打印出来。
  2. 嵌套for循环的状态为%%B,文件名为%%C
  3. 使用:case_do"%%~B"作为参数调用标签"%%~C"
  4. 标签setlocal中使用了可选的:case_do,以将设置变量保留为本地范围。
  5. status被赋予第一个参数的值。
  6. filename被赋予第二个参数的值。
  7. 打印2个变量的名称和值。
  8. %status%与每个A M D进行比较,然后转到匹配的标签。
  9. 如果不是A M D中的任何一个,则会转到可选的:case_else
  10. 当案例结束时,执行将返回for循环中的调用者。
  11. for循环完成后,goto :case_done将结束该部分。
  12. 在嵌套for循环中设置的标记不应该进行变量替换 在问题中发布示例输出。

    此代码示例中不需要延迟扩展。