У меня есть эта частичная партия, но она выдает ошибку (на 64-битных установках)

SETLOCAL EnableDelayedExpansion

REM Figure out what ProgramFiles Root we run the command
SET ProgFiles86Root=%ProgramFiles(x86)%
IF NOT "%ProgFiles86Root%"=="" GOTO win64
SET ProgFiles86Root=%ProgramFiles%
:win64

REM Get the Last installation of MVS
FOR /f "tokens=*" %%G in ('dir /b /a:d "%ProgFiles86Root%\Microsoft Visual Studio *"') do set NEWPATH=%PATH%;%ProgFiles86Root%\%%G\Common7\IDE

REM Find Tf in existing PATH + latest rev of MVS
FOR %%X in (tf.exe) do (set TFEXE=%%~$NEWPATH:X)

FOR /f "tokens=1" %%a IN ('"%TFEXE%" history . /r /noprompt /stopafter:1 /Version:W ^| FINDSTR /R "^[0-9][0-9]*"') do set TFS_BUILD=%%a

Последняя строка завершается с ошибками в зависимости от того, как я цитирую или экранирую TFEXE как% TFEXE% или!TFEXE! с ошибками вроде:

'C:\Program' is not recognized as an internal or external command,
operable program or batch file.

или же

\Microsoft was unexpected at this time.

Обратите внимание, что TFEXE расширяется до:

C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\TF.exe

Я знаю, что могу сделать это с временным файлом, но я пытаюсь избежать использования любых временных файлов и использую только канал для получения токена для установки конечной переменной TFS_BUILD

1 ответ1

0

После некоторых размышлений я нашел формулу, которая работает.

FOR /f "tokens=1" %%g in ('"%TFEXE%" history . /r /noprompt /stopafter:1 /Version:W ^| findstr /R ^[0-9][0-9]*') do set TFS_BUILD=%%g

Вопрос, который у меня возник, заключается в том, почему цитирование регулярного выражения в findstr может привести к сбою всей операции. Тем не менее, это работает для меня, и я выкладываю это для всех, чтобы иметь возможность хирургически извлекать выходные данные из исполняемого файла без неловкого использования сохранения его во временном файле.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .