代码之家  ›  专栏  ›  技术社区  ›  DextrousDave

在新行中设置包含多个值的变量

  •  1
  • DextrousDave  · 技术社区  · 6 年前

    set EmailText=%var1% %var2% %var3% %var4%
    

    EmailText值全部位于一行。我希望var1、var2、var3和var4的值都在自己的行上,这将加载到电子邮件应用程序中。

    我试过使用^字符,例如%var1%^%var2%,但不起作用。

    谢谢

    2 回复  |  直到 6 年前
        1
  •  3
  •   Aacini    6 年前

    你需要插入 <LF> 变量定义中的字符 使用延迟扩展显示其值:

    @echo off
    setlocal EnableDelayedExpansion
    
    set "var1=One"
    set "var2=Two"
    set "var3=Three"
    set "var4=Four"
    
    set ^"EmailText=%var1%^
    
    %var2%^
    
    %var3%^
    
    %var4%^"
    
    echo !EmailText!
    

    尽管可以删除定义中变量值之间的空行,但所需的语法既难看又尴尬。。。

    编辑 :新版本以实现 新的 评论中的要求。。。

    @echo off
    setlocal EnableDelayedExpansion
    
    for /F %%a in ('copy /Z "%~F0" NUL') do set "CR=%%a"
    
    set "var1=One"
    set "var2=Two"
    REM set "var3=Three"
    set "var4=Four"
    
    set "EmailText="
    for %%v in (var1 var2 var3 var4) do (
       if defined %%v set ^"EmailText=!EmailText!!%%v!!CR!^
    %Do not remove this line%
    ^"
    )
    
    echo !EmailText!
    

    One
    Two
    Four
    
        2
  •  1
  •   lit    6 年前

    下面的脚本测试每个变量是否有内容,并将字符串附加在一起。如果文本中可以出现分号,请选择另一个字符作为换行分隔符。

    @echo off
    setlocal EnableDelayedExpansion
    
    set "var1=One"
    set "var2=Two"
    set "var3=Three"
    set "var4=Four"
    
    SET LF=^
    
    
    REM Do not remove blank lines for LF.
    
    set "EmailText="
    IF NOT "%var1%" == "" (SET "EmailText=%EmailText%%var1%;")
    IF NOT "%var2%" == "" (SET "EmailText=%EmailText%%var2%;")
    IF NOT "%var3%" == "" (SET "EmailText=%EmailText%%var3%;")
    IF NOT "%var4%" == "" (SET "EmailText=%EmailText%%var4%")
    
    SET "EmailText=%EmailText:;=!LF!%"
    
    echo !EmailText!
    EXIT /B 0
    

    示例运行:

    12:56:51.62  C:\src\t\emailtext
    C:>emailtext.bat >t.txt
    
    12:57:07.74  C:\src\t\emailtext
    C:>type t.txt
    One
    Two
    Three
    Four