【问题标题】:The process cannot access the file because it is being used by another process.(Batch file)该进程无法访问该文件,因为它正被另一个进程使用。(批处理文件)
【发布时间】:2015-08-17 08:55:24
【问题描述】:

Device1.bat

@echo off
    :: script for updating property files
    SETLOCAL EnableExtensions
    SETLOCAL EnableDelayedExpansion
    if "%3"=="" (
      ECHO Script will optionally accept 3 args: PropKey PropVal File
      SET PROPKEY=Deviceid
      SET PROPVAL=dfs2341f
      SET FILE=config.properties
    ) ELSE (
      SET PROPKEY=%1
      SET PROPVAL=%2
      SET FILE=%3
    )
    FINDSTR /B %PROPKEY% %FILE% >nul
    IF %ERRORLEVEL% EQU 1 GOTO nowork
    MOVE /Y "%FILE%" "%FILE%.bak"
    FOR /F "USEBACKQ tokens=*" %%A IN (`TYPE "%FILE%.bak" ^|FIND /N /I "%PROPKEY%"`) DO (
      SET LINE=%%A
    )
    FOR /F "tokens=1,2* delims=]" %%S in ("%LINE%") DO SET LINE=%%S
    SET /A LINE=%LINE:~1,6%
    SET /A COUNT=1
    FOR /F "USEBACKQ tokens=*" %%A IN (`FIND /V "" ^<"%FILE%.bak"`) DO (
      IF "!COUNT!" NEQ "%LINE%" (
          ECHO %%A>>"%FILE%"
      ) ELSE (
          ECHO %PROPKEY%=%PROPVAL%>>"%FILE%"
          ECHO Updated %FILE% with value %PROPKEY%=%PROPVAL%
      )
      SET /A COUNT+=1
    )
    GOTO end
    :nowork
    echo Didn't find matching string %PROPKEY% in %FILE%. No work to do.
    pause
    :end

Device2.bat

@echo off
        :: script for updating property files
        SETLOCAL EnableExtensions
        SETLOCAL EnableDelayedExpansion
        if "%3"=="" (
          ECHO Script will optionally accept 3 args: PropKey PropVal File
          SET PROPKEY=Deviceid
          SET PROPVAL=dfs2341f
          SET FILE=config.properties
        ) ELSE (
          SET PROPKEY=%1
          SET PROPVAL=%2
          SET FILE=%3
        )
        FINDSTR /B %PROPKEY% %FILE% >nul
        IF %ERRORLEVEL% EQU 1 GOTO nowork
        MOVE /Y "%FILE%" "%FILE%.bak"
        FOR /F "USEBACKQ tokens=*" %%A IN (`TYPE "%FILE%.bak" ^|FIND /N /I "%PROPKEY%"`) DO (
          SET LINE=%%A
        )
        FOR /F "tokens=1,2* delims=]" %%S in ("%LINE%") DO SET LINE=%%S
        SET /A LINE=%LINE:~1,6%
        SET /A COUNT=1
        FOR /F "USEBACKQ tokens=*" %%A IN (`FIND /V "" ^<"%FILE%.bak"`) DO (
          IF "!COUNT!" NEQ "%LINE%" (
              ECHO %%A>>"%FILE%"
          ) ELSE (
              ECHO %PROPKEY%=%PROPVAL%>>"%FILE%"
              ECHO Updated %FILE% with value %PROPKEY%=%PROPVAL%
          )
          SET /A COUNT+=1
        )
        GOTO end
        :nowork
        echo Didn't find matching string %PROPKEY% in %FILE%. No work to do.
        pause
        :end

我同时运行 device1.bat 和 device2.bat。 Device1.bat 运行正常。但是 device2.bat throwing 进程无法访问该文件,因为它正在被另一个进程使用。请帮我解决这个问题。

【问题讨论】:

  • 这是因为config.propertiesDevice1.bat使用
  • 好的。如何使用批处理脚本关闭 config.properties?
  • Device1.bat 正在访问 config.properties,要关闭它,您需要等待该过程完成。

标签: windows batch-file cmd


【解决方案1】:

您可以制作 config.properties 的临时副本以供 device2 使用并稍后将其删除。 设备 1:

@echo off
    :: script for updating property files
    SETLOCAL EnableExtensions
    SETLOCAL EnableDelayedExpansion
    if "%3"=="" (
      ECHO Script will optionally accept 3 args: PropKey PropVal File
      SET PROPKEY=Deviceid
      SET PROPVAL=dfs2341f
      SET FILE=config.properties
  ::make a temporary copy of config.properties
      copy config.properties config2.properties
    ) ELSE (
      SET PROPKEY=%1
      SET PROPVAL=%2
      SET FILE=%3
    )
    FINDSTR /B %PROPKEY% %FILE% >nul
    IF %ERRORLEVEL% EQU 1 GOTO nowork
    MOVE /Y "%FILE%" "%FILE%.bak"
    FOR /F "USEBACKQ tokens=*" %%A IN (`TYPE "%FILE%.bak" ^|FIND /N /I "%PROPKEY%"`) DO (
      SET LINE=%%A
    )
    FOR /F "tokens=1,2* delims=]" %%S in ("%LINE%") DO SET LINE=%%S
    SET /A LINE=%LINE:~1,6%
    SET /A COUNT=1
    FOR /F "USEBACKQ tokens=*" %%A IN (`FIND /V "" ^<"%FILE%.bak"`) DO (
      IF "!COUNT!" NEQ "%LINE%" (
          ECHO %%A>>"%FILE%"
      ) ELSE (
          ECHO %PROPKEY%=%PROPVAL%>>"%FILE%"
          ECHO Updated %FILE% with value %PROPKEY%=%PROPVAL%
      )
      SET /A COUNT+=1
    )
    GOTO end
    :nowork
    echo Didn't find matching string %PROPKEY% in %FILE%. No work to do.
    pause
    :end

DEVICE2.bat:

@echo off
        :: script for updating property files
        SETLOCAL EnableExtensions
        SETLOCAL EnableDelayedExpansion
        if "%3"=="" (
          ECHO Script will optionally accept 3 args: PropKey PropVal File
          SET PROPKEY=Deviceid
          SET PROPVAL=dfs2341f
::changed config.properties to config2.properties
          SET FILE=config2.properties
        ) ELSE (
          SET PROPKEY=%1
          SET PROPVAL=%2
          SET FILE=%3
        )
        FINDSTR /B %PROPKEY% %FILE% >nul
        IF %ERRORLEVEL% EQU 1 GOTO nowork
        MOVE /Y "%FILE%" "%FILE%.bak"
        FOR /F "USEBACKQ tokens=*" %%A IN (`TYPE "%FILE%.bak" ^|FIND /N /I "%PROPKEY%"`) DO (
          SET LINE=%%A
        )
        FOR /F "tokens=1,2* delims=]" %%S in ("%LINE%") DO SET LINE=%%S
        SET /A LINE=%LINE:~1,6%
        SET /A COUNT=1
        FOR /F "USEBACKQ tokens=*" %%A IN (`FIND /V "" ^<"%FILE%.bak"`) DO (
          IF "!COUNT!" NEQ "%LINE%" (
              ECHO %%A>>"%FILE%"
          ) ELSE (
              ECHO %PROPKEY%=%PROPVAL%>>"%FILE%"
              ECHO Updated %FILE% with value %PROPKEY%=%PROPVAL%
          )
          SET /A COUNT+=1
        )
        GOTO end
        :nowork
        echo Didn't find matching string %PROPKEY% in %FILE%. No work to do.
        pause
::delete the temporary config2.properties
del /f /q config2.properties
        :end

希望有帮助!

【讨论】:

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