Batch file dos批量从字符串中提取字符
我正在一个文件中阅读第一列,其中包含Batch file dos批量从字符串中提取字符,batch-file,dos,Batch File,Dos,我正在一个文件中阅读第一列,其中包含0002C1,0002C2,0003C1,0004C1 仅提取前4位数字并将其放入变量中 FOR /F "tokens=1" %i IN (export.txt) DO ( echo %i set s=%i:~0,4% echo %s% ) 在输出中,echo%i的结果是正确的,提取数字似乎也可以正常工作(当我尝试一个条目时,结果是正确的),但s的值似乎没有改变! 有人能看出问题出在哪里吗 以下是我收到的输出: 0002C1 %s% 00
0002C1
,0002C2
,0003C1
,0004C1
仅提取前4位数字并将其放入变量中
FOR /F "tokens=1" %i IN (export.txt) DO (
echo %i
set s=%i:~0,4%
echo %s%
)
在输出中,echo%
i的结果是正确的,提取数字似乎也可以正常工作(当我尝试一个条目时,结果是正确的),但s
的值似乎没有改变!
有人能看出问题出在哪里吗
以下是我收到的输出:
0002C1
%s%
0002C2
%s%
0003C1
%s%
0004C1
%s%
首先:您需要使用setlocalenabledayedexpansion命令展开变量 第二:你试图“削减”一个特殊的var(%i:~0,1%),你不能 我的解决方案:
@Echo OFF
:: By Elektro H@cker
FOR /F %%# IN (export.txt) DO (
Call Set "Token=%%#"
Call Set "Token=%%Token:~0,4%%"
Call Echo %%Token%%
)
Pause&Exit
您的脚本存在一些问题,只需进行一些调整,效果非常好 您需要使用延迟扩展来访问在
for
循环中创建的变量
setlocal enabledelayedexpansion
FOR /F "tokens=1" %%i IN (export.txt) DO (
echo %%i
set x=%%i
set s=!x:~0,4!
echo !s!
)
唯一的区别是将%
替换为代码>,告诉cmd使用延迟扩展来读取变量
使用批处理文件时,需要对变量的使用双%
您还需要将%%i
分配给某个对象,这样您就可以在其任一侧使用变量符号,在本例中,我使用了x
秒:您正试图“剪切”一个特殊的变量(%i:~0,1%),您不能。如果我运行命令集s=%I:~0,4%超出for循环,它仍然可以正常工作!如果变量不在FOR循环中,那么它就不是一个特殊的(FOR)变量,显然,您可以将变量从循环中“切除”。我建议您在此网站www.ss64了解有关ARG vars和FOR vars的更多信息。com@user1861059:这可能是因为在set s=…
语句之前的某个时间设置了一个名为i
的环境变量。语法同时使用打开和关闭%
,这意味着您只能在其中使用环境变量,而不能使用循环变量(或参数)。@ElektroHacker:注意调用-扩展比延迟扩展慢(如果文件较大,可能很重要).你是对的,但我始终不希望启用DelayedExpansion,因为在扩展变量时丢失的字符会出现问题。谢谢你的评论。