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,因为在扩展变量时丢失的字符会出现问题。谢谢你的评论。