Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理文件中的独立标记_Batch File_Dos - Fatal编程技术网

Batch file 批处理文件中的独立标记

Batch file 批处理文件中的独立标记,batch-file,dos,Batch File,Dos,我有下面的代码图片来获取每个文件的第一个令牌,但它不起作用。请让我知道什么是错误的,以及我如何可以取得对方的线单独令牌 我的制表符分隔txt文件如下所示: ABC 1000 GHY_GGG ADD 2000 ABCSS 3000 JJY_GGG 我的代码如下: for /f "tokens=* usebackq delims= " %%a in ("%TraderWorkspaceFile%") do ( set line=%%a call

我有下面的代码图片来获取每个文件的第一个令牌,但它不起作用。请让我知道什么是错误的,以及我如何可以取得对方的线单独令牌

我的制表符分隔txt文件如下所示:

ABC     1000     GHY_GGG
ADD     2000     
ABCSS     3000     JJY_GGG
我的代码如下:

for /f "tokens=* usebackq delims= " %%a in ("%TraderWorkspaceFile%") do (
set line=%%a

call :processToken
)
goto :eof

:processToken

  for /f "tokens=1 delims= " %%f in ("%line%") do (      
   echo Got one token: %%f
  )

goto :eof
谢谢

FOR/F命令读取文件的行,并根据“tokens=delims=“option”在标记中分隔它们。默认情况下,“令牌”仅指行中的第一个令牌,“delims”包括空格和制表符(如果没有给出)。此命令适用于以下命令:

for /f "usebackq" %%a in ("%TraderWorkspaceFile%") do echo %%a
将显示:

ABC
ADD
ABCSS
1000
2000
3000
鉴于

for /f "tokens=2 usebackq" %%a in ("%TraderWorkspaceFile%") do echo %%a
将显示:

ABC
ADD
ABCSS
1000
2000
3000
请注意,“delims=”与默认值相同,因此是无用的,但“delims=”(no delims)是一种将整行包含在第一个标记中的技巧

for /f "usebackq delims=" %%a in ("%TraderWorkspaceFile%") do (
set line=%%a
call :processToken
)
goto :eof

:processToken
  for /f "tokens=1 delims= " %%f in ("%line%") do (      
   echo Got one token: %%f
  )
goto :eof
将正确显示每行的第一个标记,尽管:

:processToken
  for /f %%f in ("%line%") do (      
   echo Got one token: %%f
  )
goto :eof
会做完全相同的事情

您还可以通过子例程的参数通过以下方式获得单个空格或制表符分隔的标记:

:processLine
echo First token: %1, second token: %2, third one: %3
goto :eof
必须以这种方式调用的(而不是调用:processToken):

FOR/F命令读取文件的行,并根据“tokens=delims=“option”将它们分隔为标记。默认情况下,“令牌”仅指行中的第一个令牌,“delims”包括空格和制表符(如果没有给出)。此命令适用于以下命令:

for /f "usebackq" %%a in ("%TraderWorkspaceFile%") do echo %%a
将显示:

ABC
ADD
ABCSS
1000
2000
3000
鉴于

for /f "tokens=2 usebackq" %%a in ("%TraderWorkspaceFile%") do echo %%a
将显示:

ABC
ADD
ABCSS
1000
2000
3000
请注意,“delims=”与默认值相同,因此是无用的,但“delims=”(no delims)是一种将整行包含在第一个标记中的技巧

for /f "usebackq delims=" %%a in ("%TraderWorkspaceFile%") do (
set line=%%a
call :processToken
)
goto :eof

:processToken
  for /f "tokens=1 delims= " %%f in ("%line%") do (      
   echo Got one token: %%f
  )
goto :eof
将正确显示每行的第一个标记,尽管:

:processToken
  for /f %%f in ("%line%") do (      
   echo Got one token: %%f
  )
goto :eof
会做完全相同的事情

您还可以通过子例程的参数通过以下方式获得单个空格或制表符分隔的标记:

:processLine
echo First token: %1, second token: %2, third one: %3
goto :eof
必须以这种方式调用的(而不是调用:processToken):


你说你的文件是分开的,但在我看来你的“delims”选项被设置为一个
。如果我是正确的,那么您可以通过将“delims=”后面的空格更改为选项卡来解决问题。或者更好的是,如果您的值中没有空格,那么您可以简单地删除delims选项,因为默认的分隔符是

假设您可以整理出第一个令牌,那么扩展代码以解析出所有3个令牌就很简单了。只需更改为“tokens=1-3”。令牌1将位于%%f,令牌2位于%%g,令牌3位于%%h


顺便说一句,我不明白为什么要使用2个循环。看起来您可以在第一个FOR循环中直接解析出标记。除非您发布的代码是对实际代码的简化,并且您计划用整行代码做一些事情;)

您说您的文件是
分隔的,但在我看来,您的“delims”选项设置为
。如果我是正确的,那么您可以通过将“delims=”后面的空格更改为选项卡来解决问题。或者更好的是,如果您的值中没有空格,那么您可以简单地删除delims选项,因为默认的分隔符是

假设您可以整理出第一个令牌,那么扩展代码以解析出所有3个令牌就很简单了。只需更改为“tokens=1-3”。令牌1将位于%%f,令牌2位于%%g,令牌3位于%%h


顺便说一句,我不明白为什么要使用2个循环。看起来您可以在第一个FOR循环中直接解析出标记。除非您发布的代码是对实际代码的简化,并且您计划用整行代码做一些事情;)

所有问题报告都应该有显示问题的最小代码示例(您的代码示例)、预期行为(同样,您提供了此代码示例)和实际行为(不,在任何地方都看不到):-)所有问题报告都应该有显示问题的最小代码示例(您的代码示例)、预期行为(同样,您提供了此代码示例)和实际行为(不,在任何地方都看不到):-)非常感谢阿奇尼。。帮了大忙!!此外,是否有方法计算一行中的令牌数?如果令牌没有通配符(*?)或分隔符(,;=),则计数立即进行:设置n=0,后面跟着%%a in(%line%)do set/a n+=1谢谢很多Aacini。。帮了大忙!!此外,是否有方法计算一行中的令牌数?如果令牌没有通配符(*?)或分隔符(,;=),则立即计数:设置n=0,后跟%%a in(%line%)do set/a n+=1