我有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个文件夹,例如folder1
,folder2
,folder3
,folder4
。这是创建应用程序服务器的所有日志文件的地方。
记录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个文件夹,例如folder1
,folder2
,folder3
,folder4
。这是创建Web服务器的所有日志文件的地方。
我想将X
天的日志文件从每个位置移动到一个单独的位置:
Destination=\\192.168.7.x\D$\backups\Prod App & Web Error Logs Backup\
在上述目标位置下,应创建两个文件夹,例如App
和Web
。
现在,我想将所有App1
,App2
,App3
文件夹复制到目标App
文件夹。
Web1
,Web2
,Web3
到目标Web
文件夹。
但是应该自动创建目录结构。
我试过了:
for /D %i in ("%Source_App1%*") do if not exist "%Destination%\App\App1\%i" mkdir "%Destination%\App\App1\%i"
但它没有用。
你能帮帮我吗?
答案 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_
和给定示例中的数字(App
和Web
)之间的源变量名称部分派生的;其中的另一个子目录使用相同的名称创建,但包含尾随数字部分(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