我正在尝试制作一个CMD批处理脚本,它将执行以下操作。
为了说明, 文件A的第一行是Hello1,文件B的第一行是Hello2
我想得到一个输出显示这个 %counter %%文本文件的第一行%,
所以我的例子看起来应该是这样的:
2 Hello2 1 Hello1
但相反,我得到了这个:
2 1 Hello2
我目前的代码是这样的。
set file.1=A.txt
set file.2=B.txt
set counter=2
SETLOCAL EnableDelayedExpansion
set counter=%counter%
:loop
if %counter% NEQ 0 (
set /p texte=<!file.%counter%!
echo %counter% %texte%
set /a counter=%counter%-1
gotop loop)
我该如何解决这个问题?
答案 0 :(得分:0)
您已使用setlocal
命令设置延迟扩展(顺便说一句,该命令应该有相应的endlocal
),但您似乎不是使用< / em>在所需的所有地方延迟扩张。
延迟扩展变量需要使用!
进行扩展,不 %
。
当然,一旦你这样做,你就会发现像!file.!counter!!
这样的表达式的问题,因为cmd.exe
不是,错误,最伟大的工具在世界上: - )
然而,这个事实已经产生了世界上一些最狡猾的编码器,迫使他们解决这些限制,你可以按照call
使用@setlocal enableextensions enabledelayedexpansion
@echo off
set file.1=A.txt
set file.2=B.txt
set counter=2
:loop
if !counter! NEQ 0 (
call :sneaky_set fspec file.!counter!
set /p texte=<!fspec!
echo !counter! !texte!
set /a counter=!counter!-1
goto loop
)
endlocal
goto :eof
:sneaky_set
set %1=!%2!
goto :eof
进行双重间接变量以下程序:
call
fspec
语句通过file.N
和N
(第一级间接,counter
是sneaky_set
中的当前值)到{{ 1}}。它反过来执行:
set fspec=!file.N!
是第二个级别的间接,因此将file
设置为正确的*.txt
值。