3

我正在处理一个 Windows 批处理文件来执行与服务器的双向同步。多人将使用该批处理文件将多台计算机与一个网络位置同步。由于限制我不会进入,它必须是一个批处理文件。没有 vbscript,没有 javascript,只有 windows 批处理。Powershell 命令可能没问题,只要我可以从批处理文件中运行它们。

为了允许删除文件,它会多次运行 robocopy。首先,它使用 /MAXLAD 开关复制比上次运行脚本时更新的文件。它在两个方向上都这样做。然后,它使用 /l 开关进行镜像并检查退出代码以检测额外文件。如果任何一方有额外的文件,它会在适当的方向上真正运行镜像。

该脚本按原样运行良好,但是...

问题是,/MAXLAD 接受格式为 YYYYMMDD 的日期,因此,如果您在本地创建文件,运行同步脚本,然后立即删除文件并再次同步,它就从坟墓里回来了。为了成功删除一个文件,它需要在您最后一次运行脚本之前至少一天未修改。我想要一些方法来消除这个限制,所以它可以按照我的用户喜欢的频率运行并按预期工作。

我的问题是:有什么方法可以使最后访问时间更精确吗?即使我可以将它缩小到一个小时,这将是一个改进。除了 robocopy 之外,我还应该做其他事情来复制新文件吗?

4

1 回答 1

1

使用ROBOCOPYAFAIK,不可能比一天更精确。
但是,可以使用其他两种方法获得更精细的信息。

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.

上面的代码并不像看起来那么长和复杂。大部分都是简单的注释,将近一半占用了代码。其余大部分是冗余代码,仅用于显示

于 2012-10-21T09:03:50.760 回答