【问题标题】:How to use bat script to check for the size of a file in the folder and move it如何使用bat脚本检查文件夹中文件的大小并移动它
【发布时间】:2019-01-17 10:54:17
【问题描述】:

感谢任何人的帮助。我非常坚持这一点。

我正在编写一个 bat 脚本来将文件从一个文件夹移动到另一个文件夹。 (这部分很简单)

但是,在实际移动文件之前,我想检查文件的大小是否每 45 秒更改一次。如果文件的最后大小等于当前大小,则 finally 将移动它。 (此检查的原因是因为源文件夹中的文件可能仍在写入中,我们不想在它完成之前移动它)

请帮忙,我愿意接受建议

目前有这个代码,卡住了:

for %%a in (%_fromFolder%\*%_fileName%*%_extension%) DO (
echo %%~za
set "fname=%~1"
set fSize = %%~za
timeout /t 45 /nobreak
:loop
if fSize == %%~za (
    echo %fSize%
    echo %%~za
    goto :moveF
) else (
    set fSize =%%~za
    timeout /t 45 /nobreak
    goto :loop
)

)

:moveF
move %~1 %_toFolder%

【问题讨论】:

  • FOR 命令块之外进行检查。只需使用FOR 命令获取文件大小并将其设置为变量。然后进行检查并超时。
  • 如果文件是打开写入,您将无法移动它。您可以尝试移动它并检查移动是否失败?
  • 您是否将文件作为参数传递给此批处理文件?我问的唯一原因是因为这行代码:set "fname=%~1"。如果您已经将文件名作为参数,则无需 FOR 命令获取大小。
  • @Squashman:感谢您的回复,但该文件夹可能有多个文件需要检查和移动。
  • @EdxTribal,你不能FOR 命令块内执行GOTO。它破坏了FOR 命令。

标签: batch-file filesize movefile


【解决方案1】:

我已经在代码中放置了 cmets 来解释它在做什么。

REM Get list of files
for %%G in ("%_fromFolder%\*%_fileName%*%_extension%") DO (
    REM Call function to check for the size of the file
    CALL :CHECK "%%G"
    REM Back from the Function. now move the file
    move "%%~G" "%_toFolder%"
)

GOTO :EOF

:CHECK
REM set the size of the file to a variable
set "fsize=%~z1"
REM delay program
timeout /t 45 /nobreak
REM check to see if the file size is the same. IF it is then leave the function
if "%fSize%"=="%~z1" GOTO :EOF
REM Go back to the check if the file size is not the same
GOTO CHECK

【讨论】:

  • 非常感谢您,如果您不介意我问为什么我们在 CHECK 中使用 %~z1 而不是 %~zG ? z1 是否代表当前文件 %%G 的大小?抱歉,我对 bat 脚本还是有点陌生​​。
  • 当您调用标签时,任何传递的参数都会成为标签的参数。就像使用常规批处理文件一样。
  • @EdxTribal for 元变量的范围仅限于 for 命令的行或(代码块)。因此,您可以在子例程中重用相同的变量 - 尽管这会混淆代码;-)