我正在处理Windows批处理文件以执行与服务器的双向同步。批处理文件将由多人使用,以使具有单个网络位置的多台计算机同步。由于我不会涉及的限制,它必须是一个批处理文件。没有vbscript,没有javascript,只有windows批处理。只要我可以从批处理文件中运行它们,Powershell命令就可以了。
为了允许删除文件,它会多次运行robocopy。首先,它使用/ MAXLAD开关复制比上次运行脚本时更新的文件。它在两个方向都这样做。然后,它使用/ l开关执行镜像并检查退出代码以检测额外的文件。如果任何一方有额外的文件,它会在适当的方向上运行镜像。
脚本按原样运行良好,但是......
问题是,/ MAXLAD接受YYYYMMDD格式的日期,因此如果您在本地创建文件,请运行同步脚本,然后立即删除该文件并再次同步,它将从坟墓中返回。为了成功删除文件,它必须在您上次运行脚本之前至少一天内未经修改。我想要一些删除此限制的方法,因此可以像我的用户一样经常运行并按预期工作。
我的问题是:是否有某种方法可以更精确地使用上次访问时间?即使我能把它缩小到一小时,也会有所改善。我应该做除了robocopy以外的其他工作来复制新文件吗?
答案 0 :(得分:1)
使用ROBOCOPY
AFAIK,无法比一天更精确地获得准确性
但是, IS 可以使用其他两种方法进行更细化。
DIR /o:d /a:-d
将当前目录的文件从最新到最旧排序,并将任何目录从列表中删除
要撤消列表,使其最新到最新,请将/o:d
更改为/o:-d
。
此外,FOR
语句可以做同样的事情。
@ECHO OFF
setlocal ENABLEDELAYEDEXPANSION
set count=0
:: If some other process left %tmp%\temp.txt, delete it.
if exist %tmp%\temp.txt del %tmp%\temp.txt
for %%x in (*.*) do (
set /a count=!count!+1
:: Capture Size
set size=000000%%~zx
:: Capture Date and Time
set td=%%~tx
:: Turn Date into YYYY/MM/DD format
set dd=!td:~6,4!/!td:~0,5!
:: Set tt=hour of day
set tt=!td:~11,2!
:: Turn AM/PM time into 24 hour day time
if !td:~-2!==PM set /a tt=!tt!+12
:: Add :Minutes to time
set tt=!tt!:!td:~-5,2!
:: Append Size Date Time FileName to temp.txt
call echo !size:~-5! !dd! !tt! %%x>>%tmp%\temp.txt
rem :: Create variable size[n] and set it to: Size Date Time FileName
rem call set size[!count!]=!size:~-5! !dd! !tt! %%x
)
echo.
echo Size Date Time FileName
echo ===== ========== ===== ===============
::
:: Alternate 1: Replacing the Append line to `temp.
:: :: Print Array into %tmp%\temp.txt
:: for /l %%x in (1 1 %count%) do (
:: :: Pipe variable into a file
:: echo !size[%%x]!>>%tmp%\temp.txt
:: )
::
:: Alternate 2: Another way to iterate through the array size[n]
:: :loop
:: set /a ctr=%ctr%+1
:: echo !size[%ctr%]!
:: if %ctr% lss %count% goto loop
::
:: Sort temp.txt, starting at the 6th character (the date).
type %tmp%\temp.txt | sort.exe /+6
del %tmp%\temp.txt
echo.
上面的代码并不像它看起来那么复杂。其中大部分都是简单的评论,几乎有一半占用了代码。其余大部分都是冗余代码,仅显示