如何使用windows cmd / batch从git命令输出设置variables

我无法将输出转发给variables。 我正在使用Atlassian SourceTree和我的GIT版本。 在那里,我想创build一个自定义操作,我可以轻松地创build一个提交的所有修改文件的zip文件。 创build的文件应该在文件名中的格式化date为update-<YYYYmmdd>T<hhMM>.zip

到目前为止,我的工作batch file(行号供以后参考)

 1: setlocal enabledelayedexpansion 2: set output= 3: for /f "delims=" %%a in ('git diff-tree --no-commit-id --name-only -r %1^^') do ( set output=!output! "%%a" ) 4: set hours= 5: git show -s --format=%%ci %1 > tmptmptmp & set /p hours= < tmptmptmp & del tmptmptmp 6: set hours=%hours:~0,4%%hours:~5,2%%hours:~8,2%T%hours:~11,2%%hours:~14,2% 7: git archive -o update-%hours%.zip HEAD %output% 8: endlocal 

我很难重写第5行(小时行)以避免创build一个临时文件。 如果我像第3行(输出行)那样做:

 for /f "delims=" %%a in ('git show -s --format=%%ci %1^^') do ( set hours=!hours! "%%a" ) 

我得到以下错误:

致命的:模棱两可的论点'%ci':未知的版本或path不在工作树中。 使用' – '来分隔修订版本的path,例如: git <command> [<revision>...] -- [<file>...]

我认为这与所需的%ci参数(格式化输出)有关。

有人可以帮我吗?

我不知道为什么在第5行git show -s --format=%%ci %1使用相同的命令,添加尾随的^ caret (一个旋律口音 )。

但是, = 等于登录 --format=%%ci应该转义如下:

 for /f "delims=" %%a in ('git show -s --format^=%%ci %1^^') do set hours=!hours! "%%a" 

证明样本

 ==>type 29803777.bat IF NOT [%1]==[] dir /B %1= for /f "delims=" %%a in ('IF NOT [%1]==[] dir /B %1=') do @echo "%%a" for /f "delims=" %%a in ('IF NOT [%1]^=^=[] dir /B %1^=') do @echo "%%a" ==>29803777.bat x ==>IF NOT [x] == [] dir /B x= x.txt ==>for /F "delims=" %a in ('IF NOT [x] [] dir /B x ') do @echo "%a" [] was unexpected at this time. ==>for /F "delims=" %a in ('IF NOT [x]==[] dir /B x=') do @echo "%a" "x.txt" ==>