windows - 调用其他批处理文件后批处理中断

标签 windows if-statement for-loop batch-file cmd

我有一个问题,我的批处理每次调用另一个批处理文件后都会中断。批处理文件用于从 IBM Rhapsody 运行制作过程。将调用从 Rhapsody 转换为 Visual Studio 工具。因此,nmake 将在进行不同设置后从批处理中调用。

脚本并非完全由我编写,我只是将主题适配为在 x86 和 x64 两种 windows 体系结构版本下运行。第一个脚本 (vs2005_make.bat) 将从 Rhapsody 调用并运行到“call”语句。第二个脚本 (Vcvars_VisualStudio2005.bat) 运行到最后。但是第一个脚本没有恢复工作,此时进程中断,没有错误消息。

我对批处理文件不是很熟悉,这是我第一次在批处理文件中制作不仅仅是简单的控制台命令。所以我希望我已经提供了所有需要的信息,否则请问我。

这里是启动脚本(vs2005_make.bat):

:: parameter 1 - Makefile which should be used
:: parameter 2 - The make target mark

@echo off

IF "%2"==""        set target=all
IF "%2"=="all"     set target=all
IF "%2"=="build"   set target=all
IF "%2"=="rebuild" set target=clean all
IF "%2"=="clean"   set target=clean

set RegQry="HKLM\Hardware\Description\System\CentralProcessor\0"
REG.exe Query %RegQry% > checkOS.txt 
Find /i "x86" < CheckOS.txt > StringCheck.txt

IF %ERRORLEVEL%==0 (
  set arch=x86
) ELSE (
  set arch=x64
)

call "%ProgramFiles%\IBM\Rhapsody752\Share\etc\Vcvars_VisualStudio2005.bat" %arch%

IF %ERRORLEVEL%==0 (
  set makeflags=
  nmake /nologo /S /F %1 %target%
) 

del checkOS.txt
del StringCheck.txt

exit

这里是被调用的脚本(Vcvars_VisualStudio2005.bat):

:: param 1 - Processor architecture

@echo off

ECHO param 1 = %1

IF %1==x86 (
    SET ProgrammPath=%ProgramFiles%
) ELSE IF %1==x64 (
    SET ProgrammPath=%ProgramFiles(x86)%
) ELSE (
    ECHO Unknowen architectur
    EXIT /B 1
)

SET VSINSTALLDIR="%ProgrammPath%\Microsoft Visual Studio 8\Common7\IDE"
SET VCINSTALLDIR="%ProgrammPath%\Microsoft Visual Studio 8"
SET FrameworkDir=C:\WINDOWS\Microsoft.NET\Framework
SET FrameworkVersion=v2.0.50727
SET FrameworkSDKDir="%ProgrammPath%\Microsoft Visual Studio 8\SDK\v2.0"
rem Root of Visual Studio common files.

IF %VSINSTALLDIR%=="" GOTO Usage
IF %VCINSTALLDIR%=="" SET VCINSTALLDIR=%VSINSTALLDIR%

rem
rem Root of Visual Studio ide installed files.
rem
SET DevEnvDir=%VSINSTALLDIR%

rem
rem Root of Visual C++ installed files.
rem
SET MSVCDir=%VCINSTALLDIR%\VC

SET PATH=%DevEnvDir%;%MSVCDir%\BIN;%VCINSTALLDIR%\Common7\Tools;%VCINSTALLDIR%Common7  \Tools\bin\prerelease;%VCINSTALLDIR%\Common7\Tools\bin;%FrameworkSDKDir%\bin;%FrameworkDir%\%FrameworkVersion%;%PATH%;
SET INCLUDE=%MSVCDir%\ATLMFC\INCLUDE;%MSVCDir%\INCLUDE;%MSVCDir%\PlatformSDK\include\gl;%MSVCDir%\PlatformSDK\include;%FrameworkSDKDir%\include;%INCLUDE%
SET LIB=%MSVCDir%\ATLMFC\LIB;%MSVCDir%\LIB;%MSVCDir%\PlatformSDK\lib;%FrameworkSDKDir%\lib;%LIB%

GOTO end

:Usage

ECHO. VSINSTALLDIR variable is not set. 
ECHO.
ECHO SYNTAX: %0

GOTO end

:end

这里是控制台输出,我在这里不明白并且发现非常可疑的是,在第一个脚本中的“IF %ERRORLEVEL%”语句之后,无论 echo 设置为关闭,所有内容都会被输出......

Executing: "C:\Programme\IBM\Rhapsody752\Share\etc\vs2005_make.bat" Simulation.mak build

IF %ERRORLEVEL%==0 (
Mehr?   set arch=x86
Mehr? ) ELSE (
Mehr?   set arch=x64
Mehr? )

call "%ProgramFiles%\IBM\Rhapsody752\Share\etc\Vcvars_VisualStudio2005.bat" %arch%
:: param 1 - Processor architecture

@echo off

ECHO param 1 = %1
param 1 = x86

IF %1==x86 (
Mehr?   SET ProgrammPath=%ProgramFiles%
Mehr? ) ELSE IF %1==x64 (
Mehr?   SET ProgrammPath=%ProgramFiles(x86)%
Mehr? ) ELSE (
Mehr?   ECHO Unknowen architectur
Mehr?   EXIT /B 1
Mehr? )

SET VSINSTALLDIR="%ProgrammPath%\Microsoft Visual Studio 8\Common7\IDE"
SET VCINSTALLDIR="%ProgrammPath%\Microsoft Visual Studio 8"
SET FrameworkDir=C:\WINDOWS\Microsoft.NET\Framework
SET FrameworkVersion=v2.0.50727
SET FrameworkSDKDir="%ProgrammPath%\Microsoft Visual Studio 8\SDK\v2.0"
rem Root of Visual Studio common files.

IF %VSINSTALLDIR%=="" GOTO Usage
IF %VCINSTALLDIR%=="" SET VCINSTALLDIR=%VSINSTALLDIR%

rem
rem Root of Visual Studio ide installed files.
rem
SET DevEnvDir=%VSINSTALLDIR%

rem
rem Root of Visual C++ installed files.
rem
SET MSVCDir=%VCINSTALLDIR%\VC

SET PATH=%DevEnvDir%;%MSVCDir%\BIN;%VCINSTALLDIR%\Common7\Tools;%VCINSTALLDIR%\Common7\Tools\bin\prerelease;%VCINSTALLDIR%\Common7\Tools\bin;%FrameworkSDKDir%\bin;%FrameworkDir%\%FrameworkVersion%;%PATH%;
SET INCLUDE=%MSVCDir%\ATLMFC\INCLUDE;%MSVCDir%\INCLUDE;%MSVCDir%\PlatformSDK\include\gl;%MSVCDir%\PlatformSDK\include;%FrameworkSDKDir%\include;%INCLUDE%
SET LIB=%MSVCDir%\ATLMFC\LIB;%MSVCDir%\LIB;%MSVCDir%\PlatformSDK\lib;%FrameworkSDKDir%\lib;%LIB%

GOTO end

Build Done    

我希望有人有想法,我现在工作两天了,没有发现错误...谢谢你的期待。

注意:“Mehr?”这个词在文本输出中是德语,意思是“更多”。我不知道它是从哪里来的,它可能是从英语输出到德语的错误翻译。

最佳答案

“mehr”/“more”一词来自 cmd.exe,因为它离开了批处理上下文。
问题是,为什么它能做到这一点?
通常这发生在一个循环中,在没有 CALL 的情况下开始另一个批处理。

所以我最好的猜测是,您在其中一个路径目录中有一个 FIND.BAT 文件。 您可以尝试在您的批处理中注释 FIND 命令。

您还可以测试 echo ### %undefined%
如果它仍在批处理上下文中,您只会看到哈希,否则它会回显 ### %undefined%

然后您可以移动该行以找到导致命令。

关于windows - 调用其他批处理文件后批处理中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17278173/

相关文章:

javascript - 替代成百上千的 if 语句

objective-c - 如何在 - plist 数组中找到所有值?

javascript - 检测所有顶级目录

c++ - 处理 syskeydown 消息时禁用烦人的声音

c++ - 当一个功能完成另一个功能打开时我该怎么办?

python - 使用 Python 检查字符串是否在文件中

.net - 窗体 : Merge ContextMenuStrip MenuItem with existing menu in VS2010

c++ - 我可以在 _beginthreadex() 成功后立即调用 CloseHandle() 吗?

vb.net - 嵌套 For 循环 vb.net

javascript for 循环不会循环创建的用户