作者:胡慧君孟勋欣怡 | 来源:互联网 | 2022-12-10 13:31
鉴于bin\
内部德尔福项目中包含的文件目录Cert.pem
和Key.pem
低于德尔福后生成事件的唯一副本,如果这两个文件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:\Binaries\Cert.pem
存在,Key.pem
永远不会复制该文件.
如何在后期制作活动中解决这个问题?
编辑:与我的2014年帖子不同,这确实可以使用括号.请参阅下面的答案.
1> Jeroen Wiert..:
Delphi后构建事件的问题在于它们不是批处理文件.
这意味着看起来像行的语句被Delphi IDE连接成一个大的&
&符号分隔语句.这确保命令按顺序执行,根据命令重定向,管道 - 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
被视为第一个if
语句的"then"部分的延续:第二个语句if
在$(OUTPUTDIR)Cert.pem
存在时永远不会执行.
有用的是一个鲜为人知的功能,您可以将每个命令包装在括号内.通常这是为了允许一个命令跨越多行(特别是for if
和for
.. do
循环),但它也适用于一行.
包含if
括号内的语句的每一行确保它们成为不影响其他行的独立语句,即使它们与&
符号分隔符连接在一起.
在对话框中,它看起来像这样:
(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)))
现在它按预期工作:
当$(OUTPUTDIR)Cert.pem
存在,但$(OUTPUTDIR)Key.pem
没有,只是$(OUTPUTDIR)Cert.pem
被复制
什么$(OUTPUTDIR)Cert.pem
时候存在但确实存在$(OUTPUTDIR)Key.pem
,只$(OUTPUTDIR)Key.pem
复制
当两者都不存在时,两者都被复制
当两者都存在时,都不会被复制
在编写我的2014年后Delphi预建/预链接/ postbuild事件时,我不知道这个"技巧" ,所以我需要为它编写更新.
搜索批处理文件括号网站:microsoft.com -site:social.technet.microsoft.com -site:answers.microsoft.com没有在官方文档中显示它,但我并不感到惊讶,因为它变得歇斯底里,而不是设计的.或者像Old New Thing属性h2g2:
就像宇宙一样,如果有人完全理解批处理,那么语言将立即被无限怪异和更复杂的自身版本所取代.这显然至少发生过一次;)
我能找到的最好的文档是在括号/括号 - Windows CMD - SS64.com:
括号可用于跨多行分割命令.这可以使代码更具可读性.将为代码块评估变量,就像命令是单行一样.
(command)
(
command
command )
在括号内打破的事情CMD shell在评估括号时不会使用任何强大的智能,因此例如下面的命令将失败:
IF EXIST MyFile.txt (ECHO Some(more)Potatoes)
...