【问题标题】:Windows Bat: Loop a Padded RangeWindows Bat:循环填充范围
【发布时间】:2016-02-10 21:51:31
【问题描述】:

编辑: 我需要一个 bat 脚本(或单行代码)来遍历作为填充值给出的范围。它将:

  1. 取消填充 start 和 end 的值
  2. 遍历给定未填充值的范围
  3. 该值需要再次重新填充

例如:start=0980 and end=1000 and step=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%
)

最终 VAR 将被输入到命令中

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

【问题讨论】:

    标签: windows loops batch-file


    【解决方案1】:
    @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!
    )
    

    延迟扩展是关键 - 在块语句(a parenthesised series of statements) 中,整个块被解析并然后执行。块中的任何 %var% 都将替换为该变量的值在解析块时 - 在块执行之前 - 同样适用于 FOR ... DO (block)

    解决此问题的两种常见方法是 1) 使用 setlocal enabledelayedexpansion 并使用 !var! 代替 %var% 来访问 var 的更改值或 2) 调用子例程以使用改变了值。

    注意set /a 的使用,因为要分配的值是纯数字。不幸的是,前导零表示该值为OCTAL,因此请丢弃它们。

    关于延迟扩展的很多很多关于 SO 的文章...环顾四周。

    【讨论】:

    • 谢谢!不幸的是,当 'start' 和 'end' 稍后被分配时(通过 %1, %2),它们将被填充。我无法控制它!但这真的很有帮助,谢谢!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多