我想将一个字符串分成两部分,=
作为分隔符。
我看到了这个post,但我没有管理适应。
我试试这个:
set "str=4567=abcde"
echo %str%
set "var1=%str:^=="^&REM #%
echo var1=%var1%
为什么它不起作用?
答案 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%
在那里,我修好了!