windows 检查文件是否在循环的批处理文件中被锁定

rsl1atfo  于 2023-05-01  发布在  Windows
关注(0)|答案(1)|浏览(158)

我有一个脚本,它运行一些文件并将它们复制到另一个位置。但是脚本需要等到文件不再被写入。我尝试了所有的解决方案:

但问题是,它们在循环中不起作用。它总是说文件已锁定。如果脚本被取消并重新运行,它会正确地找到未锁定的文件。是我做错了什么,还是有什么诀窍能让这一切成功?
为了锁定一个测试文件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"
)
zu0ti5jz

zu0ti5jz1#

你不能在一个循环中使用goto,因为它只会完全破坏for循环。此外,exit codeerrorlevel为最后一个成功命令设置。在本例中为powershell dispose命令。只需在代码块外执行循环:

@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
)

注意,条件运算符(和&&)和(或||)有助于计算退出代码,而不需要执行ifelse语句。
编辑:

@echo off

for %%i in (*.txt) do (
    setlocal enabledelayedexpansion

    powershell -Command "[System.IO.File]::Open('%%~i', 'Open', 'Write')">nul 2>&1 && echo %%~i not locked || (
        echo %%~i Locked
        ("%systemroot%\system32\timeout.exe" /t 3)>nul
    endlocal
 )
)

相关问题