【问题标题】:how to copy x days old files from folders and subfolders to new location while maintaining current folder structure in windows?如何在保持 Windows 中当前文件夹结构的同时将 x 天前的文件从文件夹和子文件夹复制到新位置?
【发布时间】:2017-03-21 18:23:55
【问题描述】:

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

应用服务器的日志位置:

 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"

但它不起作用。

你能帮帮我吗?

【问题讨论】:

    标签: windows batch-file


    【解决方案1】:

    这对于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
    

    【讨论】:

    • 感谢您的快速回复。我会在几分钟内尝试并在这里更新。
    • 我很抱歉回复晚了,我正忙于其他工作,我已经尝试过这个解决方案,但我收到 UNC 错误,因为“错误:不支持 UNC 路径 (\\machine\share)。 ”。如何在不使用“net use”的情况下解决这个问题?
    • 代码中有一些错别字——请看我的edit...
    • 谢谢,aschipfl !!,现在两种解决方案都可以正常工作,但这是将所有服务器登录到“App”和 Web 下的单个文件夹中,它不会创建单独的文件夹,如 App1、App2、App3 和Web1、Web2 和 Web3 在目标上的父文件夹“App”和“Web”下。您也可以为此做点什么吗,非常感谢您的帮助。
    • 你的问题没有明确提到子目录,或者我没有理解正确;反正他们的创作现在已经实现了……
    猜你喜欢
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 2022-08-21
    • 1970-01-01
    相关资源
    最近更新 更多