批处理 录入多行数据

问题描述

我把git命令写入到批处理文件中,这样我可以少打几个命令.但是在git commit -m 'xxxx'这个命令中要求输入文本,这就需要这个批处理文件有输入功能,不过git commit -m 'xxxx'这个命令本身可以输入多行数据.所以我需要批处理文件有多行输入的功能

批处理 录入多行数据

callinput.bat:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@echo off
setlocal enabledelayedexpansion
call :input
echo #################################
echo !inputStr!
pause
goto :eof
::####################### 多行输入子程序input 开始
:input
echo 输入#号表示录入结束.
echo git commit -m '
:nextLine
set /p message=
if not "%message%"=="#" (
set "sum=%sum%#__#%message%"
goto :nextLine
) else (
goto :done
)
:done
::删除前面多加入的分隔符
set "sum=%sum:~4%
::输出处理后的字符
::echo %sum%
::把分隔符`#__#`替换成换行符
set inputStr=!sum:#__#=^

!
echo '
goto :eof
::####################### 多行输入子程序 结束

运行效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
输入#号表示录入结束.
git commit -m '
1
2
3
4
5
#
'
#################################
1
2
3
4
5
请按任意键继续. . .

因为,批处理文件中创建的变量在整个文件中都有效,所以就算子程序结束后,依然可以通过echo !inputStr!这样的代码来访问录入的结果.

代码详解

开启变量延迟

1
setlocal enabledelayedexpansion

如果不开启,变量操作时结果可能不正确.

循环录入功能

1
2
3
4
5
6
7
8
9
:nextLine
set /p message=
if not "%message%"=="#" (
set "sum=%sum%#__#%message%"
goto :nextLine
) else (
goto :done
)
:done

上面的程序可从键盘录入数据,遇到单独的一行#作为结束符.这样只能录入数据而已,是没有多行的效果的,

用换行符替换标记的字符

在之前录入的字符串中,我使用看#__#这个字符作为分隔符了.下面的代码就是把这个分隔符,替换成换行符.

1
2
3
4
::把分隔符`#__#`替换成换行符
set inputStr=!sum:#__#=^

!

要注意的是,感叹号之前的空行不要删掉,这样写是没有问题的.
还有就是想输出换行符,必须使用!inputStr!这样的形式,使用%inputStr%来访问时不会有换行符的.

应用到版本控制批处理文件中

首先调用上面的:input子程序来读入数据,最后用读取到的数据,提交给git commit -m即可,如下所示:

1
2
3
4
5
6
7
......
call :input
echo #################################
echo !inputStr!
git add .
git commit -m !inputStr!
......