Windows Bat:循环填充范围

时间:2016-02-10 21:51:31

标签: windows loops batch-file

编辑: 我需要一个bat脚本(或单行)来循环一个作为填充值给出的范围。它会:

  1. 取消开始和结束的值
  2. 迭代给定未填充值的范围
  3. 该值需要重新填充
  4. 例如:start = 0980,end = 1000,step = 1 我需要遍历该范围并给出一个填充号码。

    我有这么多,但我一直得到:

          function DataSelection($rootScope, CarsService) {
            var self = this;
    
            function load() {
              self.carslist = [];
              return CarsService
                .getCars()
                .then(function (carslist) {
                  self.carslist = carslist;
                })
                .then(CarsService.getCurrent)
                .then(function (data) {
                  self.currentCarIndex = data.index;
                  $rootScope.currentCarIndex = data.index;
                  self.car = data.current;
                })
                .catch(function () {
                  console.log('There is no car left, this should be disabled!');
                  location.assign('/#/thank');
                });
            }
    
            self.loaded = load();
    
            self.updateCars = function () {
              return CarsService
                .gotoNext()
                .then(function (data) {
                  self.currentCarIndex = data.index;
                  $rootScope.currentCarIndex = data.index;
                  self.car = data.current;
                })
                .catch(function () {
                  console.log('There is no car left, this should be disabled!');
                  location.assign('/#/thank');
                });
            };
    
            self.datalinks = function () {
              return self
                .loaded
                .then(function () {
                  if (!self.car) {
                    location.assign('/#/thank');
                  }
                  var folderName = self.car.toLowerCase();
                  var jsonName = self.car.toLowerCase() + '-data.json';
                  var jsonIntroName = self.car.toLowerCase() + '.json';
                  var pictureB = '' + 'assets/' + self.car.toLowerCase() + '/' + self.car.toLowerCase() + '_b.jpg' + '';
                  var pictureL = '' + 'assets/' + self.car.toLowerCase() + '/' + self.car.toLowerCase() + '_l.jpg' + '';
    
                  return {
                    folderName: folderName,
                    jsonName: jsonName,
                    jsonIntroName: jsonIntroName,
                    pictureB: pictureB,
                    pictureL: pictureL
                  };
                });
            };
          }
    

    到目前为止我所拥有的:

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

    最终VAR将被输入命令

    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%
    )
    

2 个答案:

答案 0 :(得分: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)。< / p>

解决此问题的两种常见方法是1)使用setlocal enabledelayedexpansion并使用!var!代替%var%来访问已更改的var或2}值以进行调用一个子程序,用于使用更改的值执行进一步处理。

请注意set /a的使用,因为要分配的值是纯数字。不幸的是,前导零意味着价值为OCTAL所以处置它们。

关于delayedexpansion的很多关于SO的文章......环顾四周。

答案 1 :(得分:0)

你的问题令人困惑。我不明白你是否需要一个解决方案来执行精确所描述的步骤(unpad值,迭代,重新填充值)或生成一个填充数字列表,无论使用哪种方法;另外,你显示了所需的输出,所以我假设这是这个列表: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
)