加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

批处理文件 – Windows批处理(cmd.exe)命令行参数和字符串操作

发布时间:2020-12-14 04:31:15 所属栏目:Windows 来源:网络整理
导读:让我们在 Windows批处理脚本中考虑这个FOR循环: D:MiLuDevC++temp :: type string.bat@ECHO OFFFOR %%a IN (%*) DO ECHO %%a 它一个接一个地回应所有的论点.真? D:MiLuDevC++temp :: string.bat foo.obj bar.obj CPPFLAGS=/EHscfoo.objbar.objCPPF
让我们在 Windows批处理脚本中考虑这个FOR循环:

D:MiLuDevC++temp :: type string.bat
@ECHO OFF
FOR %%a IN (%*) DO ECHO %%a

它一个接一个地回应所有的论点.真?

D:MiLuDevC++temp :: string.bat foo.obj bar.obj CPPFLAGS=/EHsc
foo.obj
bar.obj
CPPFLAGS
/EHsc

它不仅在空格(好)上分割命令行参数,而且在=(不好)上分割命令行参数.
我怎样才能防止这种情况发生?

我想要实现的很简单:NMAKE.exe的包装器指定/ 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!
    )
)

明天继续……

更新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

解决方法

解决这个问题的一种方法是指定“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!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读