批量检索 TFS 版本在 FOR /F 中出错,其中 TFS 尝试通过 PIPE 来 findstr

批量检索 TFS 版本在 FOR /F 中出错,其中 TFS 尝试通过 PIPE 来 findstr

我有这部分批次,但它给出了一个错误(在 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

经过一番努力,我找到了可行的方案。

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 中引用正则表达式会导致整个操作失败。尽管如此,它对我来说还是有用的,我将其发布出来,以便其他人可以从可执行文件中精确提取输出,而不必笨拙地将其存储到临时文件中。

相关内容