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", чтобы различать файл и папку.