如何使用Windows批处理脚本专门锁定文件1分钟?

时间:2015-08-18 22:52:04

标签: windows batch-file locking

我需要专门锁定文件,并不断在Windows 7上继续写入内容。 目标:在使用独占锁写入文件时,有一个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

1 个答案:

答案 0 :(得分:0)

:main例程的生命周期内,SAMPLEFILE.csv上有一个独占写锁。一旦:main例程返回,锁就会被释放。您可以通过添加延迟返回的命令来扩展锁定的长度。例如,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