检查文件是否被锁定在循环的批处理文件中
Check if file is locked inside a batch file for loop
我有一个脚本可以 运行 遍历一些文件并将它们复制到另一个位置。但是脚本需要等到文件不再被写入。
我在这里尝试了所有的解决方案:
- 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"
)
您不能在循环中 goto
,因为它会完全破坏 for
循环。此外,exit code
或 errorlevel
设置为最后一个成功的命令。在这种情况下是 powershell
处置命令。只需在代码块之外执行循环:
@echo off & setlocal
for %%i in (*.txt) do call :loop %%~i
goto :EOF
:loop
powershell -Command "[System.IO.File]::Open('%1', 'Open', 'Write')">nul 2>&1 && echo %1 not locked || (
echo %1 Locked
("%systemroot%\system32\timeout.exe" /t 3)>nul
goto :loop
)
请注意,条件运算符(和 &&
)和(或 ||
)有助于评估退出代码,而无需执行 if
和 else
语句。
我有一个脚本可以 运行 遍历一些文件并将它们复制到另一个位置。但是脚本需要等到文件不再被写入。 我在这里尝试了所有的解决方案:
- 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"
)
您不能在循环中 goto
,因为它会完全破坏 for
循环。此外,exit code
或 errorlevel
设置为最后一个成功的命令。在这种情况下是 powershell
处置命令。只需在代码块之外执行循环:
@echo off & setlocal
for %%i in (*.txt) do call :loop %%~i
goto :EOF
:loop
powershell -Command "[System.IO.File]::Open('%1', 'Open', 'Write')">nul 2>&1 && echo %1 not locked || (
echo %1 Locked
("%systemroot%\system32\timeout.exe" /t 3)>nul
goto :loop
)
请注意,条件运算符(和 &&
)和(或 ||
)有助于评估退出代码,而无需执行 if
和 else
语句。