【问题标题】:Windows batch For Loop dropping empty strings to the endWindows 批处理 For Loop 将空字符串放到末尾
【发布时间】:2015-06-20 18:22:27
【问题描述】:

我有以下代码。

@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

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

【问题讨论】:

    标签: windows batch-file for-loop cmd


    【解决方案1】:
    @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

    【讨论】:

    • 优秀。确实如此。非常感谢!
    • 可以用文件来做同样的事情吗?我的意思是不是使用 set 命令输入值holdingline 有没有办法将文件记录读入holdingline 变量并执行相同的任务?
    【解决方案2】:

    这应该做你想做的事:

    @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
    

    ,, 替换为, , 将导致它将中间变量设置为(空格),因此将它们视为什么都没有。如果您在两个 , 之间没有任何内容,它将跳过它们,因此只存在 4 个变量,将 e-h 留空

    【讨论】:

    • 谢谢。你的解决方案让我更接近。但它仍然没有按预期处理字符串开头的第一个 null 和 2 个连续的 null。
    猜你喜欢
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 2016-05-23
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 2014-03-11
    相关资源
    最近更新 更多