【问题标题】:How to split string with "=" without for loop in batch file如何在批处理文件中使用“=”分割字符串而不使用for循环
【发布时间】:2014-12-03 10:18:29
【问题描述】:

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

我看到了这个post,但我无法适应。

我试试这个:

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

为什么它不起作用?

【问题讨论】:

  • 因为它是等号,在字符串替换时是特殊字符。

标签: batch-file split substitution


【解决方案1】:

虽然不是防弹解决方案(使用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%]

编辑以适应 cmets(cmets 中的 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

【讨论】:

  • 是的,它可以工作,但是如何在循环中使用它呢?我试过这个: for /f "delims=" %%i in ('set') do ( rem Step 1 - remove the left part set "str1=!%%i:%%i!" rem Step 2 - Get the右侧部分集 "right=!%%i:*%str1%!" rem 第 3 步 - 获取左侧部分集 "left=!%%i:%right%=!" set "left=%left:~0, -1%" 回声 [!left!] [!right!] )
  • @artoon,答案已更新。而且,当您使用for 循环时,我还包含了一个带有for 循环的代码,以便以更少的问题完成相同的工作
  • @artoon,又添加了一个。
【解决方案2】:

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

否则,for 循环是您唯一的其他选择,无需使用 3rd 方实用程序。

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

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

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

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

如果您对 for 循环过敏,并且作为练习在不考虑效率的情况下为您的问题提供解决方案,以下是您如何在不使用单个 for 循环的情况下获得字符串的前半部分。将grep 及其依赖项放入您的%PATH%。那么:

echo %str% | grep -P -o "^[^=]*" >temp.txt
set /P "var1="<temp.txt
del temp.txt
echo %var1%

那里,我修好了!

【讨论】:

  • 这完全是一个不同的问题。您应该将其作为新问题发布。
猜你喜欢
  • 2013-01-15
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
  • 1970-01-01
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多