如何使用 windows 批处理脚本将文件独占锁定 1 分钟?

How to Lock a file exclusively for 1 minute using windows batch script?

我需要独占锁定一个文件并在 windows 7. Objective:当使用独占锁写入文件时,有一个 SFTP 计划从不同的服务器拉取该文件。即使文件上有排他锁,我们也需要验证文件是否被部分拉取。 使用了下面的批处理脚本,但如何获得 30 秒到 1 分钟的锁定?

@echo off
if '%1' == '-lock' (
    shift
    goto :main
)
call %0 -lock > SAMPLEFILE.csv
goto :eof
:main
ping -n 30 127.0.0.1 > nul
echo %DATE% %TIME% - start
TREE C:\
echo %DATE% %TIME% - finish
goto :eof

SAMPLEFILE.csv 在 :main 例程的生命周期内有一个独占写锁。一旦 :main 例程 return 就会释放锁。您可以通过添加延迟 return 的命令来延长锁定的长度。例如,timeout 60 /nobreak >nul 会延迟 1 分钟释放锁。但我看不出这对你有什么好处。

锁只是防止其他进程写入文件。任何进程在锁定时仍然可以读取部分文件。可以 detect if a file is locked by another process,但我认为这对您的 SFTP 服务器没有帮助。

我认为防止部分下载文件的最简单方法是在 SFTP 帐户无法访问但位于同一卷上的文件夹中创建文件。文件完成后,您可以立即通过 MOVE 命令将其移动到正确的位置。在 MOVE 完成之前,该文件对 SFTP 是不可见的,因此不存在部分下载的风险。请注意,如果在同一卷内的两个文件夹之间移动,这只是瞬时的。

顺便说一句,您的脚本无需使用 -lock 参数调用自身。直接调用:main也可以达到同样的效果。

@echo off
call :main %* >SAMPLEFILE.csv
exit /b

:main
ping -n 30 127.0.0.1 > nul
echo %DATE% %TIME% - start
TREE C:\
echo %DATE% %TIME% - finish
exit /b