![](/img/trans.png)
[英]Execute windows batch command from Jenkins fails but runs fine in cmd.exe
[英]Windows batch (cmd.exe) command line parameters and string manipulation
让我们在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
nomao到nmake,并且 - 这也是问题 - 通过环境变量CFLAGS和CPPFLAGS到编译器, 同时包括CFLAGS的任何设置和在命令行上提供CPPFLAGS。
换句话说,我希望将脚本add /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!
)
)
明天继续......
好的,鉴于明天已经在这里,我也可以继续......所以这是一个有效的解决方案,自豪地呈现。 随意评论如何改进它。
@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
你试过以下吗?
string.bat foo.obj bar.obj "CPPFLAGS=/EHsc"
如果您自己附加CPPFLAGS
参数,请尝试将其括在引号中。
解决这个问题的一种方法是指定“CPPFLAGS = / EHsc”,然后在循环中使用%% ~a来删除双引号。
解决这个问题的另一种方法是检查%% a的第一个字符,如果它是/
然后在它之前加上一个=
。 为了实现这一点,你需要setlocal enabledelayedexpansion
,将%% a赋值给变量,然后使用%变量:~1.1%表示法来提取第一个字符,这样你就可以将它与/
进行比较。 有关此表示法的更多信息,请键入help set
。
更新 (OP更新后)
以下片段似乎有效,它比解决方案中的相应片段简单一点,并且它不包含任何参数的硬编码名称,因此它更通用:
SET allargs=
FOR %%a IN (%*) DO (
SET curarg=%%a
IF "!curarg:~0,1!" EQU "/" (
SET allargs=!allargs!=!curarg!
) ELSE (
SET allargs=!allargs! !curarg!
)
)
ECHO !allargs!
您可以在循环中使用for /f
来强制按空格分割参数列表而不是等号。 尝试这样的事情:
@echo off
setlocal enabledelayedexpansion
set params=%*
:loop
for /f "usebackq tokens=1,*" %%A in ('!params!') do (
echo %%A
set params=%%B
)
if not "!params!"=="" goto loop
endlocal
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.