2015-07-15 5 views
2

У меня есть строка base формы *+*. Я хочу получить все до +. Например, если base=foo+bar, я хочу получить foo.Batch * замена подстановочных знаков

Я пытался сделать это с заменой строки

set left=%base:+*=% 

Но это приводит к left хранения foo+bar.

Интересно, что строка замены работает получать все прямо из +:

set right=%base:*+=% 

ли +* заменяется + (т.е. группового символа является подставляя 0 символов)? Есть ли лучший способ выполнить мою задачу?

EDIT: Я на самом деле делаю это в цикле 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 
    ) 
) 

EDIT 2: Комментарии в коде выше приведены только для удобства чтения здесь. :: - комментарии стиля могут работать неправильно для циклов.

+0

Какой язык вы пишете в? –

+3

Судя по синтаксису и тегу, это пакетный файл Windows. – wOxxOm

ответ

2

Вы можете использовать this trick:

@echo off 

set "base=foo+bar" 

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

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

EDIT: Если вы хотите использовать метод внутри 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 
+0

Работает по назначению, и я узнал несколько хаков по пути. Значительное преимущество. – LastStar007

1

См http://ss64.com/nt/syntax-replace.html

Для удаления символов с правой стороны строки представляет собой процесс, два шага и требует использования автодозвона заявления:

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

Я на самом деле делаю это в цикле for, поэтому, где мне нужно заменить% на!? – LastStar007

+0

Может быть, везде. Измените свой вопрос в первом сообщении и добавьте соответствующий код. – wOxxOm

+0

Ну, все, что вам нужно исправить, это добавить 'call' перед' set left = '. Или вы можете использовать другие ответы. – wOxxOm

2

Я никогда имел большую удачу с заменой строки переменной окружения с помощью подстановочных знаков, вероятно, из-за правильной записи примечаний wOxxOm.

я, как правило, в пользу этого метода здесь:

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

Да, просто подумал об этом, однако вместо '' echo% base% ''Я использовал'%% base% "'. – wOxxOm

+0

Вы должны использовать '' tokens = 1 * "', на всякий случай, если есть дополнительные '+' справа. – dbenham

+0

@dbenham Не будет. – LastStar007

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% 
Смежные вопросы