2015-10-14 2 views
1

Код, приведенный ниже, является выдержкой из файла vcvarsall.bat, используемого для , для переменных среды Visual C++. Из-за ошибок (упомянутых в коде как операторы REM) переменные среды не установлены.CALL с пробелами и скобками в пути

:x86 

if exist "%~dp0bin" echo "%~dp0bin exists" 

REM The above line gives "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin exists" as output. 

if not exist "%~dp0bin\vcvars32.bat" goto missing 

call "%~dp0bin\vcvars32.bat" 

REM The above line gives 'C:\Program' is not recognized as an internal or external command as output. 
goto :SetVisualStudioVersion 

Поскольку переменные среды не установлены, я столкнулся с ошибками во время выполнения проекта nmake.

Я прошел через этот SO question и этот post, но обходные пути не помогли.

Может ли кто-нибудь предложить обходной путь для вызова call с пробелами и скобками в пути?

Edit:

я поставил тест echo заявление в начале файла vcvars32.bat, который будет вызван. Если бы файл был запущен, этот оператор должен был быть выполнен с инструкцией, напечатанной на экране. Более того, я уверен, что поток программы проходит через блок с пометкой :x86, потому что выполняются теги тестового эха, которые помещаются туда.

Edit 2: После выполнения предложения от Paul & Co, изменил нормальную set команды расширенного синтаксиса, который с кавычками. На запуск vcvars32.bat Казнь останавливается на следующих строках:

@if not "%WindowsSDK_ExecutablePath_x86%" == "" (
    @set "PATH=%WindowsSDK_ExecutablePath_x86%;%PATH%" 
) 

ошибка показана:

\Microsoft was unexpected at this time. 
+0

На самом деле, здесь я не вижу никакой ошибки, ваш код выглядит хорошо, поскольку есть кавычки вокруг путей, содержащих пробелы, и '()'; так что вы абсолютно уверены, что ошибка вызвана линией, которую вы подозреваете? – aschipfl

+2

Кажется, что ваша проблема не в вызове 'vcvars32.bat', а в коде внутри вызываемого файла. –

+0

@MCND: Спасибо за этот совет. Позвольте мне проверить, что – sjsam

ответ

1

После помощи @Jeb, я могу решить эту ошибку, используя ниже tweak в vcvars32.bat.

Я добавил

@set PATHTEMP=%PATH% 
@set PATH=%PATHTEMP:"=% 

перед тем

@if not "%WindowsSDK_ExecutablePath_x86%" == "" (
    @set "PATH=%WindowsSDK_ExecutablePath_x86%;%PATH%" 
) 

В основном я просто раздел цитату из переменной PATH.

(Задолженность до @jeb за его ценное предложение).

0
:x86 
if exist "%~dp0bin\nul" (
    rem this IF statement is useless since you are going to check if vcvars32.bat exist 
    echo "%~dp0bin exists" 
) 

set "_MVS=%ProgramFiles(x86)%\Microsoft Visual Studio 12.0\VC\bin" 
if not exist "%_MVS%\vcvars32.bat" (
    echo "%_MVS%\vcvars32.bat" is missing 
    echo please fix it and retry again. 
    exit /b 0 
) 
call "%~dp0bin\vcvars32.bat" 

Я добавил \nul в if exist "%~dp0bin\nul" различать между файлами и папками.

+0

: Thankyou, но. Я уже пробовал расширенный синтаксис set – sjsam

+0

Отсутствующий ярлык фактически присутствует в коде, не включенном здесь для краткости. – sjsam

+0

Я думаю, что это не проблема. Массив ': missing' фактически присутствует в конце этого отгруженного файла. Строка' call "% ~ dp0bin \ vcvars32.bat" 'является той, которая выдает ошибку' Вышеприведенная строка дает 'C: \ Program' не recognized'. Я уже пробовал вашу работу. Есть ли способ исправить оператор вызова? – sjsam

Смежные вопросы