CALL с пробелами и скобками в пути
Приведенный ниже код является выдержкой из файла vcvarsall.bat
, используемого для
установите переменные среды для командной строки Visual С++.
Из-за ошибок (упомянутых в коде как операторы REM) переменные среды не установлены.
: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 и этот post, но обходные пути не помогло.
Может ли кто-нибудь предложить обходной путь для вызова call
с пробелами и скобками в пути?
Edit:
Я положил тестовый оператор echo
в начале вызываемого файла vcvars32.bat. Если бы файл был запущен, этот оператор должен был быть выполнен с инструкцией, напечатанной на экране. Более того, я уверен, что поток программы проходит через блок с меткой :x86
, потому что выполняются теги тестового эха, которые помещаются там.
Изменить 2:
После выполнения предложений от Paul and Co изменили обычную команду set
на расширенный синтаксис, который заключен в кавычки.
При запуске vcvars32.bat выполнение останавливается на следующих строках:
@if not "%WindowsSDK_ExecutablePath_x86%" == "" (
@set "PATH=%WindowsSDK_ExecutablePath_x86%;%PATH%"
)
Показанная ошибка:
\Microsoft was unexpected at this time.
Ответы
Ответ 1
После помощи @Jeb, я могу разрешить эту ошибку, используя
ниже tweak в vcvars32.bat.
Я добавил
@set PATHTEMP=%PATH%
@set PATH=%PATHTEMP:"=%
до
@if not "%WindowsSDK_ExecutablePath_x86%" == "" (
@set "PATH=%WindowsSDK_ExecutablePath_x86%;%PATH%"
)
В основном я просто лишил кавычки из переменной PATH.
(Задолженность перед @jeb за его ценное предложение).
Ответ 2
: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"
, чтобы различать файл и папку.