我需要独占锁定一个文件并在 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
最佳答案
在 :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
关于windows - 如何使用 Windows 批处理脚本将文件独占锁定 1 分钟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32083874/