让我们在 Windows 批处理脚本中考虑这个 FOR 循环:
D:\MiLu\Dev\C++\temp :: type string.bat
@ECHO OFF
FOR %%a IN (%*) DO ECHO %%a
它一一呼应了所有的论点。真的吗?
D:\MiLu\Dev\C++\temp :: string.bat foo.obj bar.obj CPPFLAGS=/EHsc
foo.obj
bar.obj
CPPFLAGS
/EHsc
它不仅在空格(好)上拆分命令行参数,而且在 =(不好)上拆分命令行参数。我怎样才能防止这种情况发生?
我想要实现的很简单:一个围绕 NMAKE.exe 的包装器,它指定/nologo
nmake 以及 - 这就是问题 - 通过环境变量 CFLAGS 和 CPPFLAGS 到编译器,同时包括提供的 CFLAGS 和 CPPFLAGS 的任何设置在命令行上。
换句话说,即使没有脚本,我也希望将脚本添加/nologo
到 CFLAGS 和 CPPFLAGS 的命令行输入中。总是/nologo
!不要用你的标志惹恼我,编译器同志!
更新
这是我根据迈克的回答得出的结论:
@ECHO OFF
SETLOCAL
SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%a IN (%*) DO (
SET var1=%%a
ECHO %%a - !var1! - !var1:~0,1!
IF "!var1:~0,1!" EQU "/" (
ECHO gefunden: %%a !var1!
)
)
明天继续……
更新 2
好的,鉴于明天已经到来,我不妨继续……所以这是一个可行的解决方案,自豪地提出。随意评论如何改进它。
@ECHO OFF
SETLOCAL
SETLOCAL ENABLEDELAYEDEXPANSION
SET files=
SET CFLAGS=/nologo %CFLAGS%
SET CPPFLAGS=/nologo %CPPFLAGS%
SET state=normal
FOR %%a IN (%*) DO (
SET curarg=%%a
REM ECHO %%a - !curarg! - !curarg:~0,1!
IF /I "%%a" EQU "CFLAGS" (
SET state=expecting_cflags
) ELSE IF /I "%%a" EQU "CPPFLAGS" (
SET state=expecting_cppflags
) ELSE (
IF "!curarg:~0,1!" EQU "/" (
REM ECHO gefunden: %%a !curarg!
IF "!state!" EQU "expecting_cflags" (
REM ECHO expecting_cflags
SET CFLAGS=!CFLAGS! !curarg!
) ELSE IF "!state!" EQU "expecting_cppflags" (
REM ECHO expecting_cppflags
SET CPPFLAGS=!CPPFLAGS! !curarg!
) ELSE (
ECHO Logikfehler >&2
)
) ELSE (
SET files=!files! !curarg!
)
SET state=normal
)
)
ECHO Dateien: !files! >&2
ECHO CFLAGS: !CFLAGS! >&2
ECHO CPPFLAGS: !CPPFLAGS! >&2
:: ECHO ON
nmake /nologo %files% CFLAGS="%CFLAGS%" CPPFLAGS="%CPPFLAGS%"
ENDLOCAL