我有一个脚本,它运行一些文件并将它们复制到另一个位置。但是脚本需要等到文件不再被写入。我尝试了所有的解决方案:
- How to check in command-line if a given file or directory is locked (used by any process)?
- Process a file after a file is finished being written Windows Command Line .bat
- BATCH - wait for file to be complete before picking up
但问题是,它们在循环中不起作用。它总是说文件已锁定。如果脚本被取消并重新运行,它会正确地找到未锁定的文件。是我做错了什么,还是有什么诀窍能让这一切成功?
为了锁定一个测试文件checkfile.txt
,我这样做:
(
>&2 pause
) >> checkfile.txt
然后检查文件的示例脚本如下:
@echo off
for %%i in (*.txt) do (
:loop
ping localhost -n 5 > nul
echo "check if locked"
powershell -Command "$FileStream = [System.IO.File]::Open('%%i', 'Open', 'Write'); $FileStream.Close(); $FileStream.Dispose()" >NUL 2>NUL || (goto :loop)
echo "NOT locked anymore"
)
1条答案
按热度按时间zu0ti5jz1#
你不能在一个循环中使用
goto
,因为它只会完全破坏for
循环。此外,exit code
或errorlevel
为最后一个成功命令设置。在本例中为powershell
dispose命令。只需在代码块外执行循环:注意,条件运算符(和
&&
)和(或||
)有助于计算退出代码,而不需要执行if
和else
语句。编辑: