有人可以告诉我这个FOR循环有什么问题吗?

时间:2019-03-29 13:05:28

标签: windows batch-file

道歉(如果有重复的话),但到目前为止没有其他答案有帮助。

我要做的就是遍历文件夹中的文件,然后重命名文件/扩展名的最后一部分。

简单地说-可能有1-90个文件,[文件名] _01-[文件名] _90,并且每天(通过Windows事件计划程序)该数字必须增加一。

我似乎无能为力。

当文件达到某些里程碑(30-60-90)时,文件的行为也应稍有不同,但是我相信,如果变量正确更新,这应该已经可以工作。

我已经尝试了很多变量寻址的可能组合(!variable!/%variable%/ etc。),尽管我可以进入循环,但它不会重复,也不会更新文件末尾的变量号。

SetLocal EnableDelayedExpansion
set cnt=0
for %%A in (*) do set /a cnt+=1
set /A fileNumber = %cnt%-1
set /A newFileNumber = %cnt%
echo %fileNumber%
echo %newFileNumber%
for /l %%F in (%fileNumber%,1,1) do (
    if %newFileNumber%==90 (
        ren "*_%fileNumber%.don" "*_%newFileNumber%.csv"
        )
    if %newFileNumber%==60 (
        ren "*_%fileNumber%.don" "*_%newFileNumber%.csv"
        )
    if %newFileNumber%==60 (
        "ren *_%fileNumber%.don" "*_%newFileNumber%.csv"
        )
    ren "*_%fileNumber%.don" "*_%newFileNumber%.don"
    set fileNumber=%fileNumber%-1
    set newFileNumber=%newFileNumber%-1
    )

这应该简单地更新目录中的所有文件,使文件名增加1。如果有人能指出我要去哪里,我将非常感激。

2 个答案:

答案 0 :(得分:0)

要进行数学运算,您必须将/ASET一起使用

SET x=1
SET /A x=%x%+1
ECHO %x%
  

/ A开关指定等号右边的字符串   是要计算的数值表达式。表达式评估器   非常简单,并支持以下操作   优先顺序:

对于嵌套变量,您需要使用!而不是%

SetLocal EnableDelayedExpansion

Setlocal EnableDelayedExpansion 
for /f %%G in ("abc") do ( 
    set _demo=%%G & echo !_demo!
)

答案 1 :(得分:0)

@ECHO OFF
SetLocal EnableDelayedExpansion
:: target directory name in variable for convenience.
SET "targetdir=U:\sourcedir"
:: switch to target directory
pushD "%targetdir%"
:: Start count at 100 so that it is 3 digits long
set cnt=100
dir
for %%A in (*) do set /a cnt+=1
set /A fileNumber = %cnt%
set /A newFileNumber = %cnt%+1
:: echoing last 2 characters (will be digits) of variables
echo %fileNumber:~-2% (%filenumber%)
echo %newFileNumber:~-2% (%newfilenumber%)
:: Assign %%F to values 100+actual descending by 1 to 101
for /l %%F in (%fileNumber%,-1,100) do (
 rem note need REM remarks within the loop
 REM use !varname! for current value of variable VARNAME
    if !newFileNumber:~-2!==90 (
        ECHO ren "*_!fileNumber:~-2!.don" "*_!newFileNumber:~-2!.csv"
        )
    if !newFileNumber:~-2!==60 (
        ECHO ren "*_!fileNumber:~-2!.don" "*_!newFileNumber:~-2!.csv"
        )
    if !newFileNumber:~-2!==30 (
        ECHO ren "*_!fileNumber:~-2!.don" "*_!newFileNumber:~-2!.csv"
        )
 rem Since you've just renamed (eg) _59.don to _60.csv, _59.don is missing  
    IF EXIST "*_!fileNumber:~-2!.don" ECHO ren "*_!fileNumber:~-2!.don" "*_!newFileNumber:~-2!.don"
    set /A fileNumber=fileNumber-1
    set /A newFileNumber=newFileNumber-1
    )
:: return to original directory
popd
GOTO :EOF

仅出于测试目的ECHO对所需的REN命令进行了处理。 验证命令正确无误后,将ECHO REN更改为REN,以实际重命名文件。

不幸的是,您已经向我们展示了如何无法进行一些含糊的操作。因此,我们需要弄清楚您打算做什么,这是更多的工作,并且容易追逐野鹅。

您没有说要处理文件* _90,所以我们在这里无能为力。

您似乎想将* _59.don更改为* _60.csv,但是您的重命名希望将* _60.DON更改为下一次调用,因此除非名称已从_ * 60.CSV更改回* _60 .DON,这行不通。

请注意,此例程的基础是使用变量的最后两个字符。这是为了容纳您所说的编号方案中的前导0

通常的做法是假设您将对测试目录执行任何例程以进行验证。

请注意,每个REN都是ECHO,因此它不被执行,仅被报告。将ECHO REN更改为REN以实际执行命令。

还请注意,批处理在很大程度上不区分大小写。这意味着除非您愿意,否则不必耗尽SHIFT键。