批量回显变量内部的变量
echo a variable inside a variable in batch
这是我的场景:在将每一行设置为变量后,我进行了批处理以从 file.txt 中恢复一些数字行。之后,我想在 git 命令中使用动态创建的不同变量。
我真的进步了(特别感谢这个网站)并且接近最终目标。让我们想象一下我的 file.txt 看起来像这样并调用 errorLine.txt:
365
369
389
393
413
417
437
491
515
566
587
610
681
887
964
还有我的 脚本 (blame.bat):
已编辑
FINDSTR /R /N "^.*" ..\log_test\errorLine.txt | FIND /C ":" > ..\log_test\numbLine.txt
(set /p i=)<..\log_test\numbLine.txt
echo %i%
setlocal EnableDelayedExpansion
rem Load the lines of file in "l" array:
set n=0
for /F %%a in (..\log_test\errorLine.txt) do (
set /A n+=1
set "l!n!=%%a"
)
rem Show any line you want, for example:
set n=1
git blame -L !l%n%!,+1 ..\..\core\src\filepath.cpp -e
set n=2
git blame -L !l%n%!,+1 ..\..\core\src\filepath.cpp -e
pause
这是可行的,但有没有办法不必在末尾为每一行设置(set n=1
、set n=2
、...)并在 link 中递增行数?
提前致谢。
FINDSTR /R /N "^.*" ..\log_test\errorLine.txt | FIND /C ":" > ..\log_test\numbLine.txt
(set /p i=)<..\log_test\numbLine.txt
echo %i%
set n=1
setlocal enableDelayedExpansion
for /L %%n in (1,1,%i%) do (
grep -m%%n "[0-9][0-9][0-9]" ..\log_test\errorLine.txt | tail -n1 > ..\log_test\line%%n.txt
(set /p l%%n=)<..\log_test\line%%n.txt
echo '!l%%n!'
)
echo "%l15%"
cd
pause
endlocal
可能这就是您所寻找的 for.You 需要延迟扩展并且 %%n 应该是用 %
包围的一侧。但是我没有安装 grep 和 tee 所以不确定这是否会工作。
对不起。解决你问题的方法是 insert
setlocal EnableDelayedExpansion
在你的程序开始然后使用这个:
echo '!l%%n!'
但是,我会这样做:
@echo off
setlocal EnableDelayedExpansion
rem Load the lines of file in "l" array:
set n=0
for /F %%a in (..\log_test\errorLine.txt) do (
set /A n+=1
set "l!n!=%%a"
)
rem Show any line you want, for example:
set n=15
echo '!l%n%!'
有关详细信息,请参阅 this post。
这是我的场景:在将每一行设置为变量后,我进行了批处理以从 file.txt 中恢复一些数字行。之后,我想在 git 命令中使用动态创建的不同变量。
我真的进步了(特别感谢这个网站)并且接近最终目标。让我们想象一下我的 file.txt 看起来像这样并调用 errorLine.txt:
365
369
389
393
413
417
437
491
515
566
587
610
681
887
964
还有我的 脚本 (blame.bat): 已编辑
FINDSTR /R /N "^.*" ..\log_test\errorLine.txt | FIND /C ":" > ..\log_test\numbLine.txt
(set /p i=)<..\log_test\numbLine.txt
echo %i%
setlocal EnableDelayedExpansion
rem Load the lines of file in "l" array:
set n=0
for /F %%a in (..\log_test\errorLine.txt) do (
set /A n+=1
set "l!n!=%%a"
)
rem Show any line you want, for example:
set n=1
git blame -L !l%n%!,+1 ..\..\core\src\filepath.cpp -e
set n=2
git blame -L !l%n%!,+1 ..\..\core\src\filepath.cpp -e
pause
这是可行的,但有没有办法不必在末尾为每一行设置(set n=1
、set n=2
、...)并在 link 中递增行数?
提前致谢。
FINDSTR /R /N "^.*" ..\log_test\errorLine.txt | FIND /C ":" > ..\log_test\numbLine.txt
(set /p i=)<..\log_test\numbLine.txt
echo %i%
set n=1
setlocal enableDelayedExpansion
for /L %%n in (1,1,%i%) do (
grep -m%%n "[0-9][0-9][0-9]" ..\log_test\errorLine.txt | tail -n1 > ..\log_test\line%%n.txt
(set /p l%%n=)<..\log_test\line%%n.txt
echo '!l%%n!'
)
echo "%l15%"
cd
pause
endlocal
可能这就是您所寻找的 for.You 需要延迟扩展并且 %%n 应该是用 %
包围的一侧。但是我没有安装 grep 和 tee 所以不确定这是否会工作。
对不起。解决你问题的方法是 insert
setlocal EnableDelayedExpansion
在你的程序开始然后使用这个:
echo '!l%%n!'
但是,我会这样做:
@echo off
setlocal EnableDelayedExpansion
rem Load the lines of file in "l" array:
set n=0
for /F %%a in (..\log_test\errorLine.txt) do (
set /A n+=1
set "l!n!=%%a"
)
rem Show any line you want, for example:
set n=15
echo '!l%n%!'
有关详细信息,请参阅 this post。