批量 * 通配符替换

Las*_*007 4 string replace wildcard batch-file

我有一个base形式的字符串*+*。我想得到+之前的所有内容。例如,如果base=foo+bar,我想得到foo。

我尝试过用字符串替换来做到这一点

set left=%base:+*=%
Run Code Online (Sandbox Code Playgroud)

但这会导致left存储foo+bar。

有趣的是,字符串替换可以使 + 的所有内容正确无误:

set right=%base:*+=%
Run Code Online (Sandbox Code Playgroud)

是否+*被替换+(即通配符替换 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
    )
)
Run Code Online (Sandbox Code Playgroud)

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

Aac*_*ini 6

你可以使用这个技巧:

@echo off

set "base=foo+bar"

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

echo Left=%left%
echo Right=%right%
Run Code Online (Sandbox Code Playgroud)

编辑:如果您想在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
Run Code Online (Sandbox Code Playgroud)