我有一个项目,看起来像这样:
src\ModuleA\code\somepath\test.js
src\ModuleA\code\ignorethis.txt
src\ModuleB\code\awesome.js
src\ModuleB\code\testing\file.js我想使用如下的ItemGroup从模块中获取所有这些js文件:
<ItemGroup>
<_Scripts Include="..\..\..\src\**\code\**\*.js"/>
</ItemGroup>但是,当我将它们复制到输出中时,我想剥离模块和代码路径。如果我使用这样的副本
<Copy SourceFiles="@(_Scripts)" DestinationFiles="@(Scripts->'..\tmp\Test\%(RecursiveDir)%(Filename)%(Extension)')"/>结果如下所示(因为RecursiveDir包含从第一个**开始的整个路径)
tmp\Test\ModuleA\code\somepath\test.js
tmp\Test\ModuleB\code\awesome.js
tmp\Test\ModuleB\code\testing\file.js然而,我试图得到这样的结果:
tmp\Test\somepath\test.js
tmp\Test\awesome.js
tmp\Test\testing\file.js我尝试通过添加函数的元数据,但我似乎找不到正确的转义需要使其工作。我的上一次尝试是这样的(如果我可以剥离至少1层的文件夹,我假设剥离第二层将是在另一个Meta元素中简单地重复...)
<Scripts Include="@(_Scripts)">
<NewDir>$("%(_Scripts.RecursiveDir)".Substring(0, "%(_Scripts.RecursiveDir)".IndexOf("\")))</NewDir>
</Scripts>这会产生一个Error MSB4184: The expression <cut for brevity> cannot be evaluated.
有没有更简单的方法,或者谁能告诉我正确的转义序列是什么?
发布于 2020-12-22 19:05:57
在努力进行转义并对值进行解析和处理之后,我设法使用以下方法解决了这个问题:
<_ScriptsFiles Include="..\..\..\src\*\code\**\*.js"/>
<_Scripts Include="@(_ScriptsFiles)">
<FirstSlash>$([System.String]::new('%(_ScriptsFiles.RecursiveDir)').IndexOf('\'))</FirstSlash>
<DirMinusOne>$([System.String]::new('%(_ScriptsFiles.RecursiveDir)').Substring(%(_Scripts.FirstSlash)))</DirMinusOne>
<SecondSlash>$([System.String]::new('%(_Scripts.DirMinusOne)').IndexOf('\', 1))</SecondSlash>
<DirMinusTwo>$([System.String]::new('%(_Scripts.DirMinusOne)').Substring(%(_Scripts.SecondSlash)))</DirMinusTwo>
</_Scripts>
<Copy SourceFiles="@(_Scripts)" DestinationFiles="@(_Scripts->'..\..\..\tmp\%(DirMinusTwo)\%(Filename)%(Extension)')"/>https://stackoverflow.com/questions/65401621
复制相似问题