问题
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