如何用" ="分割字符串在批处理文件中没有for循环

时间:2014-12-03 10:18:30

标签: batch-file split substitution

我想将一个字符串分成两部分,=作为分隔符。

我看到了这个post,但我没有管理适应。

我试试这个:

set "str=4567=abcde"
echo %str%
set "var1=%str:^=="^&REM #%
echo var1=%var1%

为什么它不起作用?

2 个答案:

答案 0 :(得分:3)

虽然不是防弹解决方案(使用for,artoon ),但没有更多信息,这可以完成工作

@echo off
    setlocal enableextensions enabledelayedexpansion

    set "str=4567=abcde"

    rem Step 1 - remove the left part
    set "str1=!str:%str%!"

    rem Step 2 - Get the right part
    set "right=!str:*%str1%!"

    rem Step 3 - Get the left part
    set "left=!str:%right%=!"
    set "left=%left:~0,-1%"

    echo [%left%] [%right%]

已编辑以适应评论(适用于我的代码的评论中的OP代码,或相反)

for /f "delims=" %%i in ('set') do ( 
    setlocal enabledelayedexpansion

    rem Step 1 - remove the left part
    set "str=%%i"
    for %%x in ("!str!") do set "str1=!str:%%~x!"

    rem Step 2 - Get the right part 
    for %%x in ("!str1!") do set "right=!str:*%%~x!" 

    rem Step 3 - Get the left part 
    for %%x in ("!right!") do set "left=!str:%%~x=!" 
    set "left=!left:~0,-1!" 

    echo [!left!] [!right!] 
    endlocal
)

不,如前所述,这不是防弹的,有些变量显示出问题(我说它不是防弹的吗?)。

我不明白的是要求不使用for循环然后使用for循环。这种方式更容易

for /f "tokens=1,* delims==" %%a in ('set') do (
    echo [%%a] [%%b]
)

另一种选择(不像for那么容易,比前一种更稳定,非防弹)

    for /f %%a in ('set') do (
        call :split left right %%a
        echo [!left!] [!right!]
    )
    goto :eof


:split leftVar rightVar data
    set "%~1=%~3"
    setlocal enabledelayedexpansion
    set "data=%*"
    set "data=!data:*%1 %2 %3=!"
    set "data=%data:~1%"
    endlocal & set "%~2=%data%"
    goto :eof

答案 1 :(得分:2)

正如npocmaka在上面评论的那样,=具有特殊含义,不能被传统的变量字符串操作所取代。如果你知道等号两边的长度,你就可以剥掉一些字符。例如,如果“4567”始终为4个字符,则可以set "var1=%str:~0,4%"。或者如果“abcde”总是5个字符,你可以set "var1=%str:~0,-6%"(等号为5个字符+ 1)。

否则,for循环是您唯一不使用第三方实用程序的其他选项。

for /f "delims==" %%I in ("%str%") do set "var1=%%I"

如果您安装了grep,则可以执行以下操作:

echo %str% | grep -P -o "^[^=]*"

...但您仍需要使用另一个for /f循环来捕获其输出。

如果您对for循环过敏,并且在不考虑效率的情况下为您的问题提供解决方案的练习,这里是您如何在不使用单{{1}的情况下获得字符串的前半部分}循环。将for及其依赖项放在grep中。然后:

%PATH%

在那里,我修好了!