Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 批处理脚本-FOR循环在IF测试时停止_Git_Batch File - Fatal编程技术网

Git 批处理脚本-FOR循环在IF测试时停止

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

我试图解析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
如果有人知道如何解决这个问题的话,我会绞尽脑汁来解决这个问题
谢谢

正如我在评论中提到的,您不能在循环构造的
中使用
: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