我有以下代码从“AX copy”获取最后修改的文件,并将其与“Reflex copy”中的最后修改文件进行比较。然后输出错误的差异。
我需要输出副本与“AX copy”中的输入文件具有相同的名称。我已经使用了一些东西再次声明文件名并将其分配给输出。但是我有一个问题,当在下面的代码中显示它时,它使用最旧的文件名。
请有人调整代码,以便输出副本的名称与“AX copy”文件夹中的输入相同。我的代码是:
@echo off
cd /d C:\Users\Important Structure\Development\AX copy
for /f %%a in ('dir /b /o-d /a-d /tw') do (set latest=%%a)
setlocal enableextensions disabledelayedexpansion
call :getLatestFileInFolder "C:\Users\Important Structure\Development\AX copy" latestC
call :getLatestFileInFolder "C:\Users\Important Structure\Development\Reflex copy" latestD
if not defined latestC ( echo NO File in C & exit /b )
if not defined latestD ( echo NO File in D & exit /b )
for /f "tokens=1,*" %%a in (
'diff "%latestC%" "%latestD%" ^| findstr /r /c:"^<" /c:"^>"'
) do (
>> "C:\Users\Important Structure\Development\Error\%latest%" echo(%%b
)
endlocal
exit /b
:getLatestFileInFolder folderToSearch variableToReturn
setlocal
set "folder=%~1" & if not defined folder set "folder=%cd%"
set "latest="
pushd "%folder%"
for /f "tokens=*" %%a in ('dir /b /o-d /a-d /tw 2^>nul') do (set "latest=%%~fa" & goto :latestFileFound)
:latestFileFound
popd
endlocal & set "%~2=%latest%" & goto :eof
答案 0 :(得分:0)
在这一行
for /f %%a in ('dir /b /o-d /a-d /tw') do (set latest=%%a)
列表文件中的dir命令按日期降序排列。在第一次迭代(第一个文件)时,将最新文件分配给变量,但是命令不会在此处停止,并继续迭代其余文件。因此,最后,变量包含文件夹中最旧的文件。
要解决此问题,您可以按升序日期顺序列出文件(将/o-d
更改为/od
),或使用包含的子程序
call :getLatestFileInFolder "C:\Users\Important Structure\Development\AX copy" latest
代码正在运行,与Matt向您指示的相同。 %latest%
与%latestC%
为什么不起作用。 diff命令必须打开要读取的文件,因此,当diff将其锁定时,您可能无法写入该文件。
要解决此问题,请选择一个临时文件(set "tempFile=%temp%\%~nx0.tmp"
),将生成的差异写入此临时文件,然后将此临时文件附加到原始文件(type "%tempFile%" >> "%latest%"
)或覆盖它(如果是不需要内容(type "%tempFile%" > "%latest%"
)