.bat中的文件夹操作不稳定?

时间:2012-08-06 16:30:56

标签: windows batch-file mkdir cd

我写了一个.bat来自动生成和编译一个cmake项目。

批处理文件
  1. 可选rmdir build
  2. mkdir build如果不存在
  3. cd build
  4. cmake ..从上层文件夹生成一个nmake项目
  5. nmake编译项目
  6. 来源:

    @ECHO OFF
    set "OpenCV_LIB=C:\Program Files (x86)\OpenCV2.1"
    echo !! OpenCV Library: [ %OpenCV_LIB% ]
    IF NOT EXIST "%OpenCV_LIB%" (
        echo Can't find OpenCV Library, please change OpenCV_LIB setting
        GOTO END
    )
    
    if %PROCESSOR_ARCHITECTURE%==x86   set BUILD_ARCH=x86
    if %PROCESSOR_ARCHITECTURE%==AMD64 set BUILD_ARCH=x86_amd64
    if %PROCESSOR_ARCHITECTURE%==IA64  set BUILD_ARCH=x86_IPF
    echo !! Target architecture [ %BUILD_ARCH% ]
    call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" %BUILD_ARCH%
    
    cd "sikuli-script"
    set /p answer=Do you want to make clean first? (Y/N):
    if %answer% == Y ( IF EXIST build rmdir /s /q build )
    if %answer% == y ( IF EXIST build rmdir /s /q build )
    
    IF NOT EXIST build mkdir build
    cd build
    
    IF NOT EXIST CMakeCache.txt ( cmake -G "NMake Makefiles" -D CMAKE_BUILD_TYPE=Release -D "OpenCV_DIR=%OpenCV_LIB%" .. )
    nmake
    
    :END
    pause
    

    我一遍又一遍地运行.bat后,我注意到cd build有时会失败,所以我更改了我的代码来测试它:

    @ECHO ON
    set /p answer=Do you want to make clean first? (Y/N):
    if %answer% == Y ( IF EXIST build rmdir /s /q build )
    if %answer% == y ( IF EXIST build rmdir /s /q build )
    :DO_MKDIR_CD
    IF NOT EXIST build mkdir build
    cd build
    if errorlevel 1 (
        pause
        GOTO DO_MKDIR_CD
    )
    

    每次选择清理build时都会发生错误,即使build处于小尺寸(例如中断编译后,大小为3.08 MB,183个文件,67个目录)。< / p>

    !! OpenCV Library: [ C:\Program Files (x86)\OpenCV2.1 ]
    !! Target architecture [ x86_amd64 ]
    Setting environment for using Microsoft Visual Studio 2010 x64 cross tools.
    
    D:\repo\sikuli>cd "sikuli-script"
    
    D:\repo\sikuli\sikuli-script>set /p answer=Do you want to make clean first? (Y/N):
    Do you want to make clean first? (Y/N):y
    
    D:\repo\sikuli\sikuli-script>if y == Y (IF EXIST build rmdir /s /q build  )
    
    D:\repo\sikuli\sikuli-script>if y == y (IF EXIST build rmdir /s /q build  )
    
    D:\repo\sikuli\sikuli-script>IF NOT EXIST build mkdir build
    
    D:\repo\sikuli\sikuli-script>cd build
    Access is denied.
    
    D:\repo\sikuli\sikuli-script>if errorlevel 1 (
    pause
     GOTO DO_MKDIR_CD
    )
    Press any key to continue . . .
    

    因此,每次删除并重新创建build后,cd build都会失败,然后cmake开始弄乱我的源代码树。

    错误检查和循环尝试可以解决此问题,但为什么文件系统不稳定?或者我是以错误的方式写作的?

1 个答案:

答案 0 :(得分:0)

该构建目录检查:

IF NOT EXIST build mkdir build

如果名为“build”的目录文件都不存在,将创建目录。

检查直接存在的一种方法是:

if exist build\nul echo directory exist

如果要确保目录存在,请使用:

if not exist build\nul mkdir build

或更好:

if not exist build\nul (
  mkdir build
  if not exist build\nul (
    echo mkdir failed
    goto :eof
  )
)