如何将x天旧文件从文件夹和子文件夹复制到新位置,同时在Windows中维护当前文件夹结构?

时间:2017-03-14 05:15:42

标签: windows batch-file

我有3个应用服务器和3个Web服务器。他们每个人都在自己的机器上生成日志。 日志文件路径在单独的计算机上共享(所有都是Windows计算机)。

记录App服务器的位置:

 Source_App1=\\192.168.1.x\d$\Temp\ErrorLog 
 Source_App2=\\192.168.2.x\d$\Temp\ErrorLog 
 Source_App3=\\192.168.3.x\d$\Temp\ErrorLog

在每个位置上方有4个文件夹,例如folder1folder2folder3folder4。这是创建应用程序服务器的所有日志文件的地方。

记录Web服务器的位置:

Source_Web1=\\192.168.4.x\d$\Temp\ErrorLog
Source_Web2=\\192.168.5.x\d$\Temp\ErrorLog
Source_Web3=\\192.168.6.x\d$\Temp\ErrorLog

在每个位置上方有4个文件夹,例如folder1folder2folder3folder4。这是创建Web服务器的所有日志文件的地方。

我想将X天的日志文件从每个位置移动到一个单独的位置:

Destination=\\192.168.7.x\D$\backups\Prod App & Web Error Logs Backup\

在上述目标位置下,应创建两个文件夹,例如AppWeb

现在,我想将所有App1App2App3文件夹复制到目标App文件夹。

Web1Web2Web3到目标Web文件夹。

但是应该自动创建目录结构。

我试过了:

for /D %i in ("%Source_App1%*") do if not exist "%Destination%\App\App1\%i" mkdir "%Destination%\App\App1\%i"

但它没有用。

你能帮帮我吗?

1 个答案:

答案 0 :(得分:2)

对于能够过滤特定年龄的文件和目录的forfiles command,这听起来像是一个完美的工作(按最后修改日期,时间不予考虑):

@echo off

rem // Define constants:
set "Source_App1=\\192.168.1.x\d$\Temp\ErrorLog"
set "Source_App2=\\192.168.2.x\d$\Temp\ErrorLog"
set "Source_App3=\\192.168.3.x\d$\Temp\ErrorLog"
set "Source_Web1=\\192.168.4.x\d$\Temp\ErrorLog"
set "Source_Web2=\\192.168.5.x\d$\Temp\ErrorLog"
set "Source_Web3=\\192.168.6.x\d$\Temp\ErrorLog"
set "Destination=\\192.168.7.x\D$\backups\Prod App & Web Error Logs Backup"
set "Destination_App=%Destination%\App"
set "Destination_Web=%Destination%\Web"
set "X=7" & rem // (minimum age of files in days to copy)

rem // Process App servers:
set /A "IDX=0"
for /D %%D in (
    "%Source_App1%\*"
    "%Source_App2%\*"
    "%Source_App3%\*"
) do (
    for /F %%C in ('set /A "IDX+=1"') do (
        set /A "IDX=%%C"
        pushd "%%~D"
        forfiles /D -%X% /C "cmd /C if @isdir==FALSE (2> nul mkdir 0x22%Destination_App%\App%%C\%%~nxD0x22 & copy @path 0x22%Destination_App%\App%%C\%%~nxD0x22)"
        popd
    )
)

rem // Process Web servers:
set /A "IDX=0"
for /D %%D in (
    "%Source_Web1%\*"
    "%Source_Web2%\*"
    "%Source_Web3%\*"
) do (
    for /F %%C in ('set /A "IDX+=1"') do (
        set /A "IDX=%%C"
        pushd "%%~D"
        forfiles /D -%X% /C "cmd /C if @isdir==FALSE (2> nul mkdir 0x22%Destination_Web%\Web%%C\%%~nxD0x22 & copy @path 0x22%Destination_Web%\Web%%C\%%~nxD0x22)"
        popd
    )
)

这是一种更灵活的方法,允许不同数量的服务器路径。目标服务器上的子目录的名称是从Source_和给定示例中的数字(AppWeb)之间的源变量名称部分派生的;其中的另一个子目录使用相同的名称创建,但包含尾随数字部分(App1等,以及Web1等):

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants:
set "Source_App1=\\192.168.1.x\d$\Temp\ErrorLog"
set "Source_App2=\\192.168.2.x\d$\Temp\ErrorLog"
set "Source_App3=\\192.168.3.x\d$\Temp\ErrorLog"
set "Source_Web1=\\192.168.4.x\d$\Temp\ErrorLog"
set "Source_Web2=\\192.168.5.x\d$\Temp\ErrorLog"
set "Source_Web3=\\192.168.6.x\d$\Temp\ErrorLog"
set "Destination=\\192.168.7.x\D$\backups\Prod App & Web Error Logs Backup"
set "X=7" & rem // (minimum age of files in days to copy)

rem // Process App and Web servers:
for /F "tokens=1* delims==" %%A in ('2^> nul set Source_') do (
    for /F "tokens=2 delims=_" %%C in ("%%A") do (
        for /F "tokens=1 delims=0123456789" %%D in ("%%C") do (
            for /D %%E in ("%%B\*") do (
                pushd "%%~E"
                forfiles /D -%X% /C "cmd /C if @isdir==FALSE (2> nul mkdir 0x22%Destination%\%%D\%%C\%%~nxE0x22 & copy @path 0x22%Destination%\%%D\%%C\%%~nxE0x22)"
                popd
            )
        )
    )
)

endlocal
exit /B