代码之家  ›  专栏  ›  技术社区  ›  Jeroen Wiert Pluimers

具有多个if/copy组合的生成后事件仅在第一个文件不存在时执行

  •  6
  • Jeroen Wiert Pluimers  · 技术社区  · 7 年前

    bin\ Cert.pem Key.pem ,下面的Delphi生成后事件仅在以下情况下复制两个文件 C:\Binaries\Cert.pem 不存在:

    if not exist $(OUTPUTDIR)Cert.pem (copy bin\Cert.pem $(OUTPUTDIR))
    if not exist $(OUTPUTDIR)Key.pem (copy bin\Key.pem $(OUTPUTDIR))
    

    C: \二进制文件\认证pem 文件从未被复制。

    如何在生成后事件中解决此问题?

    2014 post ,这确实可以使用括号。请看下面我的答案。

    2 回复  |  直到 7 年前
        1
  •  10
  •   Jeroen Wiert Pluimers    7 年前

    Delphi生成后事件的问题是它们不是批处理文件。

    这意味着Delphi IDE将看起来像行的语句连接成一个大的 & Command Redirection, Pipes - Windows CMD - SS64.com :

    commandA &  commandB      Run commandA and then run commandB
    

    所以这是实际执行的语句:

    if not exist $(OUTPUTDIR)Cert.pem (copy bin\Cert.pem $(OUTPUTDIR))&if not exist $(OUTPUTDIR)Key.pem (copy bin\Key.pem $(OUTPUTDIR))
    

    if 被视为第一个 如果 $(OUTPUTDIR)Cert.pem 存在。

    如果 ,和 for .. do

    包装每一行 括号内的语句确保它们成为独立的语句而不影响其他行,即使它们与 & 与号分隔符。

    在对话框中显示如下:

    (if not exist $(OUTPUTDIR)Cert.pem (copy bin\Cert.pem $(OUTPUTDIR)))
    (if not exist $(OUTPUTDIR)Key.pem (copy bin\Key.pem $(OUTPUTDIR)))
    

    这样,IDE将其转换为一个语句:

    (if not exist $(OUTPUTDIR)Cert.pem (copy bin\Cert.pem $(OUTPUTDIR)))&(if not exist $(OUTPUTDIR)Key.pem (copy bin\Key.pem $(OUTPUTDIR)))
    

    现在它按预期工作:

    • $(输出目录)认证pem 存在,但是 $(OUTPUTDIR)Key.pem 不,只是 $(输出目录)认证pem
    • 什么时候? $(输出目录)认证pem $(输出目录)密钥.pem 是的,只是 $(输出目录)密钥.pem 被复制
    • 当两者都存在时,两者都不会被复制

    我在写2014年的帖子时不知道这个“诀窍” Delphi prebuild/prelink/postbuild events

    搜索批处理文件括号 site:microsoft.com -site:social.technet.microsoft.com -site:answers.microsoft.com the Old New Thing attributes h2g2 :

    就像宇宙一样,如果有人真的完全理解了批处理,那么语言将立即被一个无限怪异和更复杂的版本所取代。这显然至少以前发生过一次;)

    我能找到的最好的文件是 Parenthesis/Brackets - Windows CMD - SS64.com :

    括号可用于跨多行拆分命令。这可以使代码更具可读性。将对代码块的变量求值,就像命令是一行一样。

     (command)
    
     (
      command
      command )
    

    CMD shell在计算括号时没有使用任何强大的智能,因此下面的命令将失败:

    IF EXIST MyFile.txt (ECHO Some(more)Potatoes)
    

    ...

        2
  •  4
  •   Brian    7 年前

    使用多个生成事件,而不是将两个命令放在同一事件中。


    我可以很容易地缩短这个过程:构建事件不是批处理文件。

    发生的情况是,生成事件中的所有行都使用与号(&)符号连接在一起,这些符号用于在一个命令行上执行多个命令。


    Delphi prebuild/prelink/postbuild events 作者:Jeroen W.Pluimers