批量*通配符替换

时间:2015-07-15 20:18:27

标签: string batch-file replace wildcard

我有一个base形式的字符串*+*。我希望在+之前得到一切。 例如,如果base=foo+bar,我想获得foo

我尝试过使用字符串替换

set left=%base:+*=%

但这导致left存储foo+bar

有趣的是,字符串替换可以使+:

的所有内容正确
set right=%base:*+=%

+*是否被+取代(即通配符代替0个字符)?有没有更好的方法来完成我的任务?

编辑:我实际上是在for循环中执行此操作。因此,延迟扩展已开启(我认为)我需要使用!完整代码:

for /d %%d in (*+*) do (
    set base=%%d
    set right=!base:*+=!
    set left=!base:+*=! ::this part doesn't work
    if !left:~-2!==!right:~-2! ( ::do only if last 2 chars match
        copy %%d mirrors
        copy %%d\%%d_montage.bmp mirrors
    )
)

编辑2:以上代码中的注释仅用于SO的可读性。 :: - 样式注释可能无法在for循环中正常工作。

4 个答案:

答案 0 :(得分:2)

我从来没有用通配符更换环境变量字符串,这可能是因为wOxxOm注意到了正确的问题。

我倾向于支持这种方法:

for /f "tokens=1,2 delims=+" %a in ('echo %base%') do (
    set left=%a
    set right=%b
)

答案 1 :(得分:2)

您可以使用this trick

@echo off

set "base=foo+bar"

set "left=%base:+=" & set "right=%"

echo Left=%left%
echo Right=%right%

编辑:如果您想在for循环中使用该方法,请按以下方式使用:

@echo off
setlocal EnableDelayedExpansion

for %%a in ("one+two" "first+last") do (
   call :separate %%a
   echo Left=!left!
   echo Right=!right!
   echo/
)
goto :EOF

:separate
set "base=%~1"
set "left=%base:+=" & set "right=%"
exit /B

答案 2 :(得分:1)

请参阅http://ss64.com/nt/syntax-replace.html

  

从字符串右侧删除字符是一个两步过程,需要使用CALL语句:

SET base=foo+bar
SET right=%base:*+=%
CALL SET left=%%base:+%right%=%%
echo %left%

答案 3 :(得分:0)

你可以从字符串中减去右边:

@echo off
setlocal enabledelayedexpansion
set "base=foo+bar"
set left=%base:*+=%
set "right=!base:+%left%=!"
echo %left% / %right%

但我建议采用另一种方法:

@echo off
set "base=foo+bar"
for /f "tokens=1,* delims=+" %%i in ("%base%") do (
  set "left=%%i"
  set "right=%%j"
)
echo %left% / %right%