How to search specific files from two folders and compare timestamp if the same or what is the newest files given using Batch Windows Scripting

江枫思渺然 提交于 2019-12-20 05:45:38

问题


I have initial code for searching and comparing in ALL files:

SET FILE1=Directory1\* 
SET FILE2=Directory2\* 


FOR %%i IN (%FILE1%) DO SET DATE1=%%~ti
FOR %%i IN (%FILE2%) DO SET DATE2=%%~ti
IF "%DATE1%"=="%DATE2%" ECHO Files have same age && GOTO END

FOR /F %%i IN ('DIR /B /O:D %FILE1% %FILE2%') DO SET NEWEST=%%i
ECHO Newer file is %NEWEST%

:END

How do specifically search based on the directory that this certain file name should be search and compare?

Sample: I want to search all specific like INV and SLS file in its name and compare if the same or what is the newest file:

in Directory1:

Flatfile           Timestamp
-------           ----------
INVF032            3/14/2019
INVF021            3/14/2019
KVNF234            3/14/2019
SLS0234            3/14/2019
SLS3211            3/14/2019

in Directory2:

Flatfile           Timestamp
-------           ----------
INVF032            3/19/2019
INVF021            3/19/2019
KVNF234            3/19/2019
SLS0234            3/19/2019
SLS3211            3/19/2019

Output:

Newer files is:
INVF032            3/19/2019
INVF021            3/19/2019
SLS0234            3/19/2019
SLS3211            3/19/2019

Adding some echo on errors in the output after running in Windows Server 2008(It says instance not available):

C:\Users\ksaycon\Desktop>sample.bat

C:\Users\ksaycon\Desktop>rem // Author: KJSaycon: Batch Script Code for JDE Flat
file Extraction version 1

C:\Users\ksaycon\Desktop>setlocal EnableExtensions DisableDelayedExpansion

C:\Users\ksaycon\Desktop>echo "Program is running. ."
"Program is running. ."

C:\Users\ksaycon\Desktop>rem // Defining the constant variables and pointers:

C:\Users\ksaycon\Desktop>set "_ROOT=C:\Users\ksaycon\Desktop\."   & rem // (set
root directory; `C:\Users\ksaycon\Desktop\.` means is script's parent directory,
 `.` means current PATH)

C:\Users\ksaycon\Desktop>set "_DIR1=C:\Users\ksaycon\Desktop\.\fp_files1\"   & r
em // (1st directory containing files)

C:\Users\ksaycon\Desktop>set "_DIR2=C:\Users\ksaycon\Desktop\.\fp_files2\"   & r
em // (2nd directory containing files)

C:\Users\ksaycon\Desktop>set _MASKS="*INV*" "*SLS*" "*PUR*"      & rem // (list
of quoted file masks, find string like *char*)

C:\Users\ksaycon\Desktop>set "_TMP1=C:\Users\ksaycon\AppData\Local\Temp\179\samp
le_1_27853.tmp"   & rem // (set temp file 1)

C:\Users\ksaycon\Desktop>set "_TMP2=C:\Users\ksaycon\AppData\Local\Temp\179\samp
le_2_15411.tmp"   & rem // (set temp file 2)

C:\Users\ksaycon\Desktop>rem // Loop 1st directory to be an absolute path:

C:\Users\ksaycon\Desktop>for %E in ("C:\Users\ksaycon\Desktop\.\fp_files1\") do
set "RDIR1=%~fE"

C:\Users\ksaycon\Desktop>set "RDIR1=C:\Users\ksaycon\Desktop\fp_files1\"

C:\Users\ksaycon\Desktop>rem // Loop 2nd directory to be an absolute path:

C:\Users\ksaycon\Desktop>for %E in ("C:\Users\ksaycon\Desktop\.\fp_files2\") do
set "RDIR2=%~fE"

C:\Users\ksaycon\Desktop>set "RDIR2=C:\Users\ksaycon\Desktop\fp_files2\"

C:\Users\ksaycon\Desktop>rem // Write all matching files in 1st directory to 1st
 temporary file using assembly language function PUSHD:

C:\Users\ksaycon\Desktop>pushd "C:\Users\ksaycon\Desktop\fp_files1\"   && (
for %F in ("*INV*" "*SLS*" "*PUR*") do (echo(%~nxF )
 popd
) 1>"C:\Users\ksaycon\AppData\Local\Temp\179\sample_1_27853.tmp"

C:\Users\ksaycon\Desktop>rem // Write all matching files in 2nd directory to 2nd
 temporary file using assembly language function PUSHD:

C:\Users\ksaycon\Desktop>pushd "C:\Users\ksaycon\Desktop\fp_files2\"   && (
for %F in ("*INV*" "*SLS*" "*PUR*") do (echo(%~nxF )
 popd
) 1>"C:\Users\ksaycon\AppData\Local\Temp\179\sample_2_15411.tmp"

C:\Users\ksaycon\Desktop>rem // Loop over all common files from both temporary f
iles:

C:\Users\ksaycon\Desktop>for /F %L in ('findstr /L /I /X /G:"C:\Users\ksaycon\Ap
pData\Local\Temp\179\sample_1_27853.tmp" "C:\Users\ksaycon\AppData\Local\Temp\17
9\sample_2_15411.tmp"') do (
rem // Build absolute `wmic`-compatible file paths:
 set "FILE1=C:\\Users\\ksaycon\\Desktop\\fp_files1\\\\%L"   & set "FILE2=C:\\Use
rs\\ksaycon\\Desktop\\fp_files2\\\\%L"
 setlocal EnableDelayedExpansion
 rem set "FILE1=&=&!" & set "FILE2=&=&!"
 rem // Loop to get standardised file date/time (last modification) of 1st file
by `wmic`:
 for /F "skip=1" %K in ('wmic DataFile where "Name='!FILE1!'" get LastModified')
 do for /F %K in ("%K") do set "DATE1=%K"
 rem // Loop to get standardised file date/time (last modification) of 2nd file
by `wmic`:
 for /F "skip=1" %K in ('wmic DataFile where "Name='!FILE2!'" get LastModified')
 do for /F %K in ("%K") do set "DATE2=%K"
 rem // If Compare file dates/times (last mod.) of both files and return differi
ng ones:
 if !DATE1! LSS !DATE2! echo "!FILE1:\\=\!" is older than "!FILE2:\\=\!"
 if !DATE1! GTR !DATE2! echo "!FILE1:\\=\!" is newer than "!FILE2:\\=\!"
 if !DATE1! EQU !DATE2! echo "!FILE1:\\=\!" and "!FILE2:\\=\!" are of same age

 endlocal
)

C:\Users\ksaycon\Desktop>(
rem // Build absolute `wmic`-compatible file paths:
 set "FILE1=C:\\Users\\ksaycon\\Desktop\\fp_files1\\\\FFPDFINV01"   & set "FILE2
=C:\\Users\\ksaycon\\Desktop\\fp_files2\\\\FFPDFINV01"
 setlocal EnableDelayedExpansion
 rem set "FILE1=&=&!" & set "FILE2=&=&!"
 rem // Loop to get standardised file date/time (last modification) of 1st file
by `wmic`:
 for /F "skip=1" %K in ('wmic DataFile where "Name='!FILE1!'" get LastModified')
 do for /F %K in ("%K") do set "DATE1=%K"
 rem // Loop to get standardised file date/time (last modification) of 2nd file
by `wmic`:
 for /F "skip=1" %K in ('wmic DataFile where "Name='!FILE2!'" get LastModified')
 do for /F %K in ("%K") do set "DATE2=%K"
 rem // If Compare file dates/times (last mod.) of both files and return differi
ng ones:
 if !DATE1! LSS !DATE2! echo "!FILE1:\\=\!" is older than "!FILE2:\\=\!"
 if !DATE1! GTR !DATE2! echo "!FILE1:\\=\!" is newer than "!FILE2:\\=\!"
 if !DATE1! EQU !DATE2! echo "!FILE1:\\=\!" and "!FILE2:\\=\!" are of same age

 endlocal
)
No Instance(s) Available.

"  do set "DATE1=Desktop>for /F %K in ("
No Instance(s) Available.

"  do set "DATE2=Desktop>for /F %K in ("
"C:\Users\ksaycon\Desktop\fp_files1\\FFPDFINV01" and "C:\Users\ksaycon\Desktop\f
p_files2\\FFPDFINV01" are of same age

C:\Users\ksaycon\Desktop>rem // Clean up temporary files:

C:\Users\ksaycon\Desktop>del "C:\Users\ksaycon\AppData\Local\Temp\179\sample_1_2
7853.tmp" "C:\Users\ksaycon\AppData\Local\Temp\179\sample_2_15411.tmp"

C:\Users\ksaycon\Desktop>echo "Clearing up garbage collection! Done."
"Clearing up garbage collection! Done."

C:\Users\ksaycon\Desktop>endlocal

C:\Users\ksaycon\Desktop>exit /B

C:\Users\ksaycon\Desktop>

回答1:


Your intention is not quite clear, particularly because your desired output is ambiguous as it does not contain the parent directories of the files.

Anyway, here is a script that does what you want (at least for my understanding), given that only files that are present in both directories are to be processed.

So this is the code, containing several explanatory rem-remarks:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_ROOT=%~dp0." & rem // (common root directory; `%~dp0.` is script's parent, `.` is current)
set "_DIR1=%_ROOT%\Directory1" & rem // (1st directory containing files)
set "_DIR2=%_ROOT%\Directory2" & rem // (2nd directory containing files)
set _MASKS="INV*." "SLS*."     & rem // (list of quoted file masks)
set "_TMP1=%TEMP%\%~n0_1_%RANDOM%.tmp" & rem // (1st temporary file)
set "_TMP2=%TEMP%\%~n0_2_%RANDOM%.tmp" & rem // (2nd temporary file)

rem // Resolve 1st directory to be an absolute path:
for %%E in ("%_DIR1%") do set "RDIR1=%%~fE"
rem // Resolve 2nd directory to be an absolute path:
for %%E in ("%_DIR2%") do set "RDIR2=%%~fE"

rem // Write all matching files in 1st directory to 1st temporary file:
pushd "%RDIR1%" && (
    for %%F in (%_MASKS%) do (
        echo(%%~nxF
    )
    popd
) > "%_TMP1%"
rem // Write all matching files in 2nd directory to 2nd temporary file:
pushd "%RDIR2%" && (
    for %%F in (%_MASKS%) do (
        echo(%%~nxF
    )
    popd
) > "%_TMP2%"

rem // Loop over all common files from both temporary files:
for /F %%L in ('findstr /L /I /X /G:"%_TMP1%" "%_TMP2%"') do (
    rem // Build absolute `wmic`-compatible file paths:
    set "FILE1=%RDIR1:\=\\%\\%%L" & set "FILE2=%RDIR2:\=\\%\\%%L"
    setlocal EnableDelayedExpansion
    rem set "FILE1=%!FILE1:&=&!" & set "FILE2=%!FILE2:&=&!"
    rem // Get standardised file date/time (last modification) of 1st file by `wmic`:
    for /F "skip=1" %%K in ('wmic DataFile where "Name='!FILE1!'" get LastModified') do for /F %%K in ("%%K") do set "DATE1=%%K"
    rem // Get standardised file date/time (last modification) of 2nd file by `wmic`:
    for /F "skip=1" %%K in ('wmic DataFile where "Name='!FILE2!'" get LastModified') do for /F %%K in ("%%K") do set "DATE2=%%K"
    rem // Compare file dates/times (last mod.) of both files and return differing ones:
    if !DATE1! leq !DATE2! echo "!FILE1:\\=\!" is older than "!FILE2:\\=\!"
    if !DATE1! gtr !DATE2! echo "!FILE1:\\=\!" is newer than "!FILE2:\\=\!"
    if !DATE1! equ !DATE2! echo "!FILE1:\\=\!" and "!FILE2:\\=\!" are of same age
    endlocal
)

rem // Clean up temporary files:
del "%_TMP1%" "%_TMP2%"

endlocal
exit /B

The core commands are:

  • findstr, to return all files that are common in the two given directories;
  • wmic, to retrieve the last modification dates/times of the files in a standardised manner (formatted like YYYYMMDDhhmmss.uuuuuu+ZZZ), which can be easily compared as strings;



回答2:


A PowerShell solution using LastWriteTime to compare.

$Dir1 = 'X:\Directory1\'
$Dir2 = 'X:\Directory2\'

ForEach ($File1 in (Get-ChildItem -Path $Dir1 -File | 
                    Where-Object Name -match "^(INV|SLS)")){
  $File2 = Join-Path $Dir2 $File1.Name
  If (Test-Path $File2 -NewerThan $File1.LastWriteTime){
    "File {0} is newer {1} in {2}" -f $File1.Name,(Get-Item $File2).LastWriteTime,$Dir2
  } else {
    "File {0} is newer {1} in {2}" -f $File1.Name,$File1.LastWriteTime,$Dir1 
  }
}

Sample output (with my locale datetime format yyyy-MM-dd HH:mm:ss):

File INVF021 is newer 2019-03-19 00:00:00 in X:\Directory2\
File INVF032 is newer 2019-03-19 00:00:00 in X:\Directory2\
File SLS0234 is newer 2019-03-19 00:00:00 in X:\Directory2\
File SLS3211 is newer 2019-03-19 00:00:00 in X:\Directory2\


来源:https://stackoverflow.com/questions/55158353/how-to-search-specific-files-from-two-folders-and-compare-timestamp-if-the-same

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!