【问题标题】:Process cannot access the file as it is used by another process进程无法访问该文件,因为它被另一个进程使用
【发布时间】:2022-01-04 16:44:16
【问题描述】:

我正在尝试创建 Windows 批处理脚本以在下载文件后检查文件的大小,但它失败并显示此消息。 该进程无法访问该文件,因为它被另一个进程使用 2048在这个时候是出乎意料的。 提前感谢您的帮助。

@echo off
d:\wget.exe ... 
Rem this wget process downloads tst_file.xml

set file="tst_file.xml"
set maxbytesize=2048

for /F "usebackq" %%A IN ('%file%') DO set size=%%~zA

if %size% LSS %maxbytesize% (echo file is less than 2KB)

【问题讨论】:

  • 您是否尝试过使用start /wait wget.exe ... 来确保过程完成?
  • 如果我从您的代码中删除 wget 命令,其他一切都会正常工作。出于这个原因,我认为问题出在wget 命令本身,我怀疑您在某处打开了tst_file.xml
  • 从不受信任的来源(如 Internet)下载文件肯定会触发反恶意软件进行快速扫描。您可以暂时禁用您的反恶意软件套件来验证这一点。
  • 我尝试了 start /wait ,但还是同样的错误
  • 可信来源

标签: windows batch-file command filesize


【解决方案1】:

考虑一下这个改动。

@echo off
d:\wget.exe ... 
Rem this wget process downloads tst_file.xml

set "file=tst_file.xml"
set maxbytesize=2048

if not exist "%file%" (
    @echo '%file%' does not exist.
    goto :SKIP_CHECK
)

for /F "usebackq" %%A IN ('%file%') DO set size=%%~zA

if %size% LSS %maxbytesize% (echo file is less than 2KB)

:SKIP_CHECK

注意事项

  • 如果文件不存在,FOR 循环将无法获取文件大小,并且 LSS 比较将在没有操作数可比较的情况下崩溃。
    • 如果你引用了每个变量(例如if "%size%" LSS "%maxbytesize%" ...),它就不会爆炸。但是,它会执行词法比较,当与任何事物进行比较时,它的计算结果都会为真。
  • 在批处理中,如果您SET 命令中的值周围使用双引号,则引号将包含在值中。即使它看起来不正统,也请在整个 <variable>=<value> 表达式周围加上引号。
  • 如果您跳过标记化并获取整行(即tokens=*),您将能够处理名称中带有空格的文件。

【讨论】:

    猜你喜欢
    • 2010-12-10
    相关资源
    最近更新 更多