Comparing Two Folders and its Subfolder batch file

前端 未结 4 1581
渐次进展
渐次进展 2021-02-09 00:27

I have two folders that contain all the same files and subfolders, but the conents inside each file may have changed. I want to write a batch file that will search through each

4条回答
  •  栀梦
    栀梦 (楼主)
    2021-02-09 00:52

    I modified a batch file I wrote for a CD process that should meet your need. It

    • takes 2 directory trees and compares each file in each tree
    • creates a list of the file differences (named File_differences.txt in the output folder)
    • and creates a folder with a diff file for each non-matching object

    If both directory structures are under the same parent, then all you need to do is update the first 8 variables in the script. If the directory trees have different parents, then read through the scripts comments. Particularly lines 14, 38 and 46.

    :: This script compares the contents of 2 trees
    :: set a workspace location for the script outside of the trees being reviewed
    set home=D:\path\to\batch_file_home
    set Input=D:\path\to\batch_file_home\Input_Files
    set Resource=D:\path\to\batch_file_home\Resource_Files
    set Output=D:\path\to\where your want to view your\Output_Files
    
    set environment=D:\path\to\parent directory containing the different tree structures (if they do not share a parent, then make this the drive)
    :: the next 3 lines are only needed if you want to predefine multiple directories for comparison 
    set Prod=production
    set QA=test
    set Dev=branches\dev
    :: If you remove the 3 lines above, then you need to replace the 2 below variables with values
    :: If the trees are not under the same parent, then include the full path for Tree A and B below
    set Tree_A=%Prod%
    set Tree_B=%QA%
    :: if you already have an object list, place it in the Input folder and remove lines 24 through 35 of this script
    set Object_List=Object_List_minus_Direcotries.txt
    set Output_File=File_differences.txt
    
    if exist %Output%\%Output_File% del %Output%\%Output_File%
    if exist %Output%\Differences\*.txt del %Output%\Differences\*.txt
    if exist %Resource%\* del /q %Resource%\*
    
    :: since you state the objects in both trees are always the same, I have not included a comparison to verify the 2 trees match
    :: this section identifies the contents of Tree A
    cd %environment%\%Tree_A%
    dir /b /s > %Resource%\Complete_Tree_A_Object_List.txt
    
    :: Next, remove the objects that are directories
    setlocal enabledelayedexpansion
    for /f "tokens=*" %%p in (%Resource%\Complete_Tree_A_Object_List.txt) do (
      dir /a:d /b %%p 2>nul >nul && (set object_type=folder) || (set object_type=file)
      echo !object_type!
      if !object_type!==file echo %%p >> %Resource%\%Object_List%
      )
    
    :: in the object list, remove the parent tree from the path
    :: if the Trees are not under the same parent, then comment out the below 6 lines
    powershell -command "(Get-Content %Resource%\%Object_List%) -replace '\\','/' | set-content %Resource%\%Object_List%"
    powershell -command "(get-content %Resource%\%Object_List%) | Foreach {$_.TrimEnd()} | Set-Content %Resource%\%Object_List%"
    set remove_parent_prefix=%environment%\%Tree_A%
    set remove_parent_prefix=%remove_parent_prefix:\=/%
    powershell -command "(Get-Content %Resource%\%Object_List%) -replace '%remove_parent_prefix%/','' | set-content %Resource%\%Object_List%"
    powershell -command "(Get-Content %Resource%\%Object_List%) -replace '/','\' | set-content %Resource%\%Object_List%"
    
    :: the below loop assumes both Trees are under the same parent.  If this is not the case, replace the cd %environment% line with cd %home%
    :: when the Trees are not under the same parent, set home to the root location, example cd D:\ 
    setlocal enabledelayedexpansion
    for /f "tokens=*" %%x in (%Resource%\%Object_List%) do (
      set Diff_File=%%x
      set Diff_File=!Diff_File:\=-!
      cd %environment%
      fc %Tree_A%\%%x %Tree_B%\%%x > "%Output%\Differences\!Diff_File!-%Output_File%"
      for %%a in ("%Output%\Differences\!Diff_File!-%Output_File%") do for /f %%b in ('find /c /v "" ^< "%%a" ') do if %%b LSS 3 del "%%a"  
      for %%R in ("%Output%\Differences\!Diff_File!-%Output_File%") do if not %%~zR lss 1 (
       echo %%x >> %Output%\%Output_File%
      )
      for %%R in ("%Output%\Differences\!Diff_File!-%Output_File%") do if %%~zR lss 1 (
         del "%Output%\Differences\!Diff_File!-%Output_File%"
      )
    )
    endlocal
    
    :: Clean up Resources.  If you want to review the temp files used to create the report, comment out the below line
    if exist %Resource%\* del /q %Resource%\*
    

提交回复
热议问题