Windows 批处理 For 循环将空字符串拖到末尾

Windows batch For Loop dropping empty strings to the end

我有以下代码。

@echo off
setlocal EnableDelayedExpansion
set holdingline=,Measure,,+ X,,,0,0
FOR /F "tokens=1,2,3,4,5,6,7,8 delims=," %%a IN ("%holdingline%") DO (
    echo %%a
    echo %%b
    echo %%c
    echo %%d
    echo %%e
    echo %%f
    echo %%g
    echo %%h
    echo %holdingline%
)
pause

显示的输出如下:

Measure
+ X
0
0
ECHO is off.
ECHO is off.
ECHO is off.
ECHO is off.
,Measure,,+ X,,,0,0

空字符串被推到最后,我想知道为什么。我希望它们按顺序排列,请这样说:

ECHO is off.
Measure
ECHO is off.
+ X
ECHO is off.
ECHO is off.
0
0
,Measure,,+ X,,,0,0

这将使我能够将它们分配给正确的变量。我尝试搜索但没有找到太多帮助。

这应该做你想做的事:

@echo off
setlocal EnableDelayedExpansion
set holdingline=,Measure,,+ X,,,0,0
FOR /F "tokens=1,2,3,4,5,6,7,8 delims=," %%a IN ("%holdingline:,,=, ,%") DO (
    echo %%a
    echo %%b
    echo %%c
    echo %%d
    echo %%e
    echo %%f
    echo %%g
    echo %%h
    echo %holdingline%
)
pause

,, 替换为 , , 将导致它将中间变量设置为 </code> (space),因此将它们视为无。如果你在两个 <code>, 之间没有任何东西,它将跳过它们,因此只存在 4 个变量,留下 e-h 空白

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
set holdingline=,Measure,,+ X,,,0,0
FOR /F "tokens=1-8 delims=," %%a IN (""%holdingline:,=","%"") DO (
    ECHO(%%~a
    ECHO(%%~b
    ECHO(%%~c
    ECHO(%%~d
    ECHO(%%~e
    ECHO(%%~f
    ECHO(%%~g
    ECHO(%%~h
    echo %holdingline%
)

GOTO :EOF

这应该可以解决您的问题


处理一个文件,生成一个新文件

@ECHO OFF
SETLOCAL
(
FOR /f "delims=" %%x IN (q29639243.txt) DO (
 set "holdingline=%%x"
 CALL :process
)
)>u:\new.txt

GOTO :EOF

:process
FOR /F "tokens=1-8 delims=," %%a IN (""%holdingline:,=","%"") DO (
    ECHO(%%~a
    ECHO(%%~b
    ECHO(%%~c
    ECHO(%%~d
    ECHO(%%~e
    ECHO(%%~f
    ECHO(%%~g
    ECHO(%%~h
    echo %holdingline%
)

GOTO :EOF

我使用了一个名为 q29639243.txt 的文件,其中包含用于我的测试的类似数据。 产生 u:\new.txt