我有这批来比较两个文件的修改日期,这两个文件在旧版本的 Windows 10'10.0.10240' 上效果很好,但在稍新版本的 Windows 10'10.0.17134.1304' 上则完全不起作用,所以我在这里错过了什么?稍新版本的 Windows 10 是否需要安装任何其他软件?
批处理文件如下所示:
@echo off
Set _File1="D:Steamsteamappscommondota 2 betagamedotabinwin64client.dll"
Set _File2="D:Programsclient.dll"
For /F "Delims=" %%I In ('xcopy /DHYL %_File1% %_File2% ^|Findstr /I "File"') Do set /a _Newer=%%I 2>Nul
If %_Newer%==1 (Set _Newer=%_File1%) Else (Set _Newer=%_File2%)
Echo The newest file is %_Newer%
Pause
在"Windows 10.0.10240"上完美运行,但在"Windows 10.0.17134.1304"上无法启动(仅打开几分之一秒,然后立即关闭)
通过在XCOPY
中包含/Q
选项,无需通过管道传递到FINDSTR
。
因此,您可以使用所选FOR /F
想法的这种修改:
@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "_File1=D:Steamsteamappscommondota 2 betagamedotabinwin64client.dll"
Set "_File2=D:Programsclient.dll"
For %%G In ("%_File1%" "%_File2%") Do If Not Exist %%G (Echo A file is missing.& GoTo :EndIt)
Set "_Newer="
For /F %%G In ('%SystemRoot%System32xcopy.exe "%_File1%" "%_File2%" /DHLQY 2^>NUL') Do If %%G Equ 1 (Set "_Newer=%_File1%") Else Set "_Newer=%_File2% or neither"
If Not Defined _Newer (Echo An error occurred.& GoTo :EndIt)
Echo %_Newer% is the newer file.
:EndIt
Pause
EndLocal
GoTo :EOF
我添加了一些额外的"调试"代码,以帮助您确定每个不同系统版本上发生的情况,并纠正您的假设,即0
意味着%_File2%
是更新的,当两者可能带有相同的日期戳时。
您的问题似乎是来自xcopy
的响应,通过findstr
过滤将1 File(s)
或0 File(s)
,并且此字符串应用于newer
然后,您的if
语句解析为
if 1 File(s)==1 ....
所以你得到一个语法错误。
要解决此问题,请从for /f
中删除"delims="
,然后使用包含空格的默认分隔符并返回默认的第一个标记,即1
或0
。
唯一真正的难题是它在早期的 Win10 中是如何工作的。
必修讲道:
使用set "var=value"
设置字符串值 - 这样可以避免尾随空格引起的问题。不要分配终端、空格或
"
- 从元素构建路径名 - 违反直觉,这可能会使过程更容易。
使用点单击和咯咯笑方法执行批处理时,如果发现语法错误或脚本运行完成,批处理窗口将关闭。您可以在语句和主页后面加上一个pause
,但最好打开一个"命令提示符"并从那里运行批处理,以便窗口保持打开状态并显示任何(错误)消息。
---校订---
经过一番实验后,我仔细观察了一下代码。
"delims="
传递我描述的字符串 - 但是 -set /a
(而不是我预期的,set
)会抓住那个数字,然后失败(因此2>nul
)所以 - 我发现如果file2
不存在,脚本将停止等待对xcopy
的问题"file2 是文件还是目录?
这可能是单击批处理失败的原因。
所以 - 我建议
set "_newer="
if exist %_file1% set "newer=1"&if exist %_file2% for ...
if defined _newer (if _%_newer%==1....) else Echo %_file1% not found