批量 - 用于 - 重命名具有计数的多个子文件夹中的文件

时间:2017-08-31 17:02:12

标签: batch-file cmd

我们公司有许多Oracle-Database-Client版本。

tnsnames.ora 会经常更改。

我喜欢创建一个包(批处理)来备份(重命名)所有版本的Oracle Client中的当前文件(如果安装了两个或更多版本),之后复制新文件。

我的脚本现在看起来如此:

setlocal enabledelayedexpansion
set /a count=0
set OracleDir="%SystemDrive%\oracle\product"

for /d %%i in (%OracleDir%\*) do (
  set dir=%%i\client_1\network\admin\

    PushD !dir:\\=\!\

    for /f "tokens=*" %%a in ('dir /b /od tnsnames.ora') do (
    rename "%%a" "tnsnames-%Date%-Backup-!count!.bak"
    )
    set /a count+=1
IF NOT EXIST "%%i\client_1\network\admin\tnsnames.ora" ( 
copy "%~dp0tnsnames.ora" "%%i\client_1\network\admin\" /Y
)
)
endlocal

到目前为止一切顺利。但该脚本只会创建一次备份文件。 但是每次运行脚本时都必须创建一个新的“ tnsnames-%Date%-Backup-!count!.bak ”。
希望你知道我的意思吗?

我敢肯定,我需要一个跳跃点,但不知道在哪里。

1 个答案:

答案 0 :(得分:0)

IMO你做的事情过于复杂。

内部for对于固定位置的文件执行dir是无用的。使用if exists更好地检查。

如果你重命名该文件,那么下一个if也没用,它就不存在 - 你只是重命名它(更好地检查重命名是否成功)

setlocal enabledelayedexpansion
set /a count=0
set OracleDir="%SystemDrive%\oracle\product"

for /d %%i in (%OracleDir%\*) do (
    set "dir=%%i\client_1\network\admin\"
    PushD "!dir:\\=\!\" || (Echo couldn't pushd "!dir:\\=\!\"&Pause)
    Set "Stamp=!Date!.!Time:~,2!.!Time:~2,2!"
    if exist tnsnames.ora if not exist "tnsnames-!Stamp!-Backup.bak" (
        rename tnsnames.ora "tnsnames-!Stamp!-Backup-!count!.bak"
    )
    set /a count+=1
    if not exist  tnsnames.ora copy "%~dp0tnsnames.ora" "!dir!"
    PopD
)
endlocal