批量 * 通配符替换
Batch * wildcard replacement
我有一个 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:上面代码中的注释仅用于此处的可读性。 :: 风格的注释在 for 循环中可能无法正常工作。
见http://ss64.com/nt/syntax-replace.html
To remove characters from the right hand side of a string is a two step process and requires the use of a CALL statement:
SET base=foo+bar
SET right=%base:*+=%
CALL SET left=%%base:+%right%=%%
echo %left%
我从来没有运气用通配符替换环境变量字符串,可能是因为正确的问题 wOxxOm 注释。
我倾向于使用这种方法:
for /f "tokens=1,2 delims=+" %a in ('echo %base%') do (
set left=%a
set right=%b
)
您可以使用 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
您可以从字符串中减去右侧:
@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%
我有一个 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:上面代码中的注释仅用于此处的可读性。 :: 风格的注释在 for 循环中可能无法正常工作。
见http://ss64.com/nt/syntax-replace.html
To remove characters from the right hand side of a string is a two step process and requires the use of a CALL statement:
SET base=foo+bar
SET right=%base:*+=%
CALL SET left=%%base:+%right%=%%
echo %left%
我从来没有运气用通配符替换环境变量字符串,可能是因为正确的问题 wOxxOm 注释。
我倾向于使用这种方法:
for /f "tokens=1,2 delims=+" %a in ('echo %base%') do (
set left=%a
set right=%b
)
您可以使用 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
您可以从字符串中减去右侧:
@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%