2016-02-10 4 views
0

EDIT: Мне нужен сценарий летучей мыши (или однострочный), чтобы пройти через диапазон, который задается в качестве дополняемого значения. Это будет:Windows Bat: Loop a Padded Range

  1. Unpad значение начала и конец
  2. итерации через диапазон дан без ведущего значения
  3. , который должен быть повторно проложенными снова

Например значение: начать = 0980 и end = 1000, а шаг = 1 Мне нужно пройти через этот диапазон и дать отложенное число обратно.

У меня это много, но я получаю:

(
SET VAR=000985 
SET VAR=~-4 
ECHO 
) 
ECHO is on. 

То, что я до сих пор:

REM Get the start, end and step values 
SET start=0980 
SET end=0985 
SET step=1 

REM Remove Padding 
FOR /F "tokens=* delims=0" %%A IN ("%start%") DO (SET start=%%A) 
FOR /F "tokens=* delims=0" %%A IN ("%end%") DO (SET end=%%A) 
FOR /l %%x in (%start%, %step%, %end%) DO ( 
    SET VAR=000%%x 
    SET VAR=%VAR:~-4% 
    ECHO %VAR% 
) 

В конце концов вар будет кормить в команду

mantra -V a -F /some/path/with.%x.ifd 

ответ

0
@echo off 
setlocal enabledelayedexpansion 
REM Get the start, end and step values 
SET /a start=980 
SET /a end=985 
SET /a step=1 

REM Remove Padding 
FOR /l %%x in (%start%, %step%, %end%) DO ( 
    SET VAR=000%%x 
    SET VAR=!VAR:~-4! 
    ECHO !VAR! 
) 

Delayedexpansion - это ключ - в пределах оператором блока (a parenthesised series of statements), всего блок разобран и затем выполнен. Любой %var% в блоке будет заменен значением этой переменной на момент анализа блока - до того, как блок будет выполнен - ​​то же самое относится к FOR ... DO (block).

Два распространенный способ преодоления этого является: 1) использовать setlocal enabledelayedexpansion и использовать !var! вместо %var%, чтобы получить доступ к измененному значению var или 2) для вызова подпрограммы, чтобы выполнить дальнейшую обработку с использованием измененных значений.

Обратите внимание на использование set /a, поскольку значения, которые необходимо назначить, являются чистыми числами. К сожалению, ведущие нули означают, что значение равно OCTAL, поэтому избавляйтесь от них.

Многие, многие статьи о SO о задержанных экспансиях ... оглядываются вокруг.

+0

спасибо! к сожалению, когда «начало» и «конец» получаются позже (через% 1,% 2), они будут дополнены. У меня нет контроля над этим! Но это действительно помогло спасибо! –

0

Ваш вопрос сбивает с толку. Я не понимаю, нужно ли вам решение, которое выполняет точно описанные шаги (значения без потерь, итерация, значение повторной прокладки) или которые генерируют список заполненных номеров независимо от используемого метода; также, вы сделали не показал, что является требуемым выходом, поэтому я предположил, что это список: 0980 0981 0982 0983 0984 0985. Наконец, вы не указали количество цифр в заполненных номерах, поэтому я предположил, что это 4 и что входные данные имеют это число цифр или больше.

Это простое решение:

@echo off 
setlocal EnableDelayedExpansion 

REM Get the start, end and step values as padded numbers 
SET start=0980 
SET end=0985 
SET step=1 

rem Convert the start and end values into an equivalent "1+N-digits" number (4 in this case) 
rem for example: start=10980 and end=10985 
set /A start=1%start:~-4%, end=1%end:~-4% 

rem Iterate through the new range: from 10980 step 1 to 10985 
for /L %%i in (%start%, %step%, %end%) do (
    rem Output the digits after the first one; for example: 0980, 0981, etc 
    echo !start:~1! 
    rem Pass to next number 
    set /A start+=step 
)