首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.bat中的文件夹操作是否不稳定?

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

Stack Overflow用户
提问于 2012-08-06 16:30:56
回答 1查看 804关注 0票数 1

我编写了一个.bat来自动生成和编译一个cmake项目。批处理文件

  1. 可选rmdir build
  2. 如果不存在mkdir build
  3. cd build
  4. cmake ..从上文件夹生成nmake项目
  5. nmake编译项目

来文提交人:

代码语言:javascript
复制
@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失败了,所以我修改了代码来测试它:

代码语言:javascript
复制
@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.08MB,183个文件,67个dirs)。

代码语言:javascript
复制
!! 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就会开始破坏我的源树。

错误检查和循环尝试可以解决这个问题,但是为什么文件系统不稳定?还是我写错了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-20 12:25:56

生成目录检查:

代码语言:javascript
复制
IF NOT EXIST build mkdir build

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

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

代码语言:javascript
复制
if exist build\nul echo directory exist

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

代码语言:javascript
复制
if not exist build\nul mkdir build

或更好:

代码语言:javascript
复制
if not exist build\nul (
  mkdir build
  if not exist build\nul (
    echo mkdir failed
    goto :eof
  )
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11832293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档