批处理去除字符串行首空格及for /f的用法详解

发布时间:2019-09-17编辑:脚本学堂
本文介绍下,在批处理中去除字符串的行首空格的方法,以及for /f参数的详细用法,大家可以作个参考。

分享一段批处理代码:
去除字符串行首空格(即字符串左边的空格,前导空格),能兼容特殊字符,且保留空行。
实现思路:批处理中for /f 的机制。

代码:
 

复制代码 代码示例:
@echo off
if "%~1" neq "" goto LTrimInit
for /f "eol= tokens=* delims= " %%a in ('"%~f0" LTrimInit') do echo=%%a
pause&exit/b
:LTrimInit
for /f "delims=" %%a in ('findstr /n .* "%~f0"') do (
set var=%%a
setlocal enableDelayedExpansion
set var=!var:*:= !
echo=!var!
endlocal
)
goto :eof

解释:
for /f 选项的机制:
解析文件(命令输出、字符串)时选取非空行作为初始循环集(to 新手:空行不是指以空格组成的行,而是该行中只有一个回车),
先用delims指定的分隔符进行分割(把分隔符去掉,得到其他部分),得到一个新循环集,这个循环集才是其他选项的依据。
eol选项看这个循环集是否以它指定的字符开头决定是否过滤掉此循环集(此行)。(过滤掉即直接跳过,后续操作直接忽视,继续处理一下行
for根据tokens选项在这个循环集能否取到它指定的令牌(部分),决定do后面的子句是否运行。
如果无法取到令牌,则子句不会执行。只要能取到一部分,子句就可以运行。
对于tokens=*,这里*相当于0个或0个以上的匹配,所以即使循环集为空(经delims分割后初始循环集变成空字符串),do子句也会执行(因为正好匹配0个),只是令牌(for的变量)为空。

复制代码 代码示例:
for /f "delims=." %a in (".") do echo 令牌=[%a],echo命令不执行
for /f "tokens=* delims=." %a in (".") do echo 令牌=[%a],echo命令执行了

不指定tokens时,默认取1。第一句中由于循环集为空,所以echo没有运行。而第二句如上所述,可以运行echo命令。
例如:
 

复制代码 代码示例:
for /f "tokens=2" %a in ("hello") do echo 令牌=[%a]
for /f "tokens=1,2" %a in ("hello") do echo 令牌=[%a],[%b]

可以用"delims="指定不要分隔符,但无法设置不要eol的过滤符,即使是用"eol=",也会以引号"为分隔符。
也就是说,无论如何,for /f 总是要包含一个行首过滤符(默认的分隔是分号“;”)。

之前以为是先用eol过滤,将过滤后的结果再递交给for进行分割。

基于以上的理解,这里的执行结果就容易明白了:
 

复制代码 代码示例:
for /f "delims=a" %a in ("aaa;hello") do echo %a