在我的 MsBuild 脚本 (*.proj) 中,我使用 XmlPeek 查询 C# 项目以获取构建配置并获取 PropertyGroup 的 Condition 属性值。这是工作代码:
<Target Name="xPeek">
<XmlPeek Namespaces="<Namespace Prefix='msb' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/>"
XmlInputPath=" D:\source\MyProject.csproj"
Query="/msb:Project/msb:PropertyGroup[contains(@Condition,'Debug')]/@Condition">
<Output TaskParameter="Result" ItemName="Peeked" />
</XmlPeek>
<Message Text="%(Peeked.Identity)" />
</Target>
这是输出:
'Release |AnyCPU' == 'Debug|AnyCPU'
'Release |AnyCPU' == 'Debug.v9|AnyCPU'
'Release |AnyCPU' == 'Debug.v10|AnyCPU'
'Release |AnyCPU' == 'Debug.v101|AnyCPU'
现在我需要在 '==' 上拆分它们,我在这里很困惑如何创建另一个 ItemGroup 或 PropertyGroup 同时拆分字符串。
%(Peeked.Identity).Split('==') 什么都不做。
问题 1:如何在拆分此 ItemGroup 的所有值时使用拆分?
问题 2:另外,是否可以从 XmlPeek 中使用的 XQuery 中获取拆分值?
最佳答案
XmlPeek 任务不允许执行额外的 Xslt 函数。不幸的是,msbuild 中没有内置的字符串函数。
我为您提供了两种解决方案:一种使用 amn XslTranformation,另一种使用命令的 Exec。
您可以使用 XslTransformation获取构建文件并利用 substring-before 对其运行转换的任务和 substring-after xslt函数。输出存储在一个文件中(在我的例子中是 test-xslt.out)和 ReadLinesfromFile读取并转换为项目。
有一个警告:在这种情况下,变量不会被替换,而对于 XmlPeek,它们会被替换。
safexml 编码版本如下所示:
<XslTransformation XmlInputPaths = "test-xslttrans.csproj"
XslContent="
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msb="http://schemas.microsoft.com/developer/msbuild/2003"
>
<xsl:output method="text" indent="yes" />
<xsl:template match="text()|@*"/>
<xsl:template match="/msb:Project/msb:PropertyGroup[contains(@Condition,'Debug')]">
<xsl:value-of select="substring-before(@Condition,'==')"/>
<xsl:text>
</xsl:text>
<xsl:value-of select="substring-after(@Condition,'==')"/>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet> "
OutputPaths = "test-xslt.out">
</XslTransformation>
<ReadLinesFromFile
File="test-xslt.out" >
<Output
TaskParameter="Lines"
ItemName="SplittedPeek"/>
</ReadLinesFromFile>
<Message Text="%(SplittedPeek.Identity)" />
为方便起见,这里是普通的 xslt:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msb="http://schemas.microsoft.com/developer/msbuild/2003">
<xsl:output method="text" indent="yes" />
<xsl:template match="text()|@*"/>
<xsl:template match="/msb:Project/msb:PropertyGroup[contains(@Condition,'Debug')]" >
<xsl:value-of select="substring-before(@Condition,'==')"/>
<xsl:text>
</xsl:text>
<xsl:value-of select="substring-after(@Condition,'==')"/>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
此解决方案将您的 Peeked 值写入文件。通过调用命令处理器的 FOR/F 命令,我们可以解析行并将它们拆分到一些非常适合这里的严格边界内。 EXEC 的输出被写入文件 split.txt。 ReadLinesFromFiles 用于读取项目中的值。
<WriteLinesToFile
File="test-xslt-write.out"
Lines="@(Peeked)"
Overwrite="true"
Encoding="ASCII"/>
<Exec Command="for /f "tokens=1* delims==" %%a in (test-xslt-write.out) do @echo %%a > split.txt"/>
<Exec Command="for /f "tokens=1* delims==" %%a in (test-xslt-write.out) do @echo %%b >> split.txt"/>
<ReadLinesFromFile
File="test-xslt.out" >
<Output
TaskParameter="Lines"
ItemName="SplittedCmdPeek"/>
</ReadLinesFromFile>
<Message Text="%(SplittedCmdPeek.Identity)" />
关于c# - MsBuild XmlPeek 结果拆分值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24906430/
我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
我从ui中得到日期范围为-approved_between"=>"2013-03-17-2013-03-18"我需要拆分此approved_start_date="2013-03-17"和approved_end_date="2013-03-18"...我希望使用它在mysql中查询,因为mysql中的日期格式是created_at:2012-07-2810:35:01.我正在做的是:approved=approved_between.split("")approved_start_date=approved[0]approved_end_date=approved[2]很确定这不是处
@locations=Location.all#currentlistingall@locations=Location.slice(5)orLocation.split(5)使用Ruby,我试图将我的列表分成4列,每列限制为5个;然而,切片或拆分似乎都不起作用。知道我可能做错了什么吗?任何帮助是极大的赞赏。 最佳答案 您可能想使用in_groups_of:http://railscasts.com/episodes/28-in-groups-of这是RyanBates在railscast中的示例用法:
我如何做Ruby方法"Flatten"RubyMethod在C#中。此方法将锯齿状数组展平为一维数组。例如:s=[1,2,3]#=>[1,2,3]t=[4,5,6,[7,8]]#=>[4,5,6,[7,8]]a=[s,t,9,10]#=>[[1,2,3],[4,5,6,[7,8]],9,10]a.flatten#=>[1,2,3,4,5,6,7,8,9,10 最佳答案 递归解决方案:IEnumerableFlatten(IEnumerablearray){foreach(variteminarray){if(itemisIEnume
我最近从C#转向了Ruby,我发现自己无法制作可折叠的标记代码区域。我只是想到做这种事情应该没问题:classExamplebegin#agroupofmethodsdefmethod1..enddefmethod2..endenddefmethod3..endend...但是这样做真的可以吗?method1和method2最终与method3是同一种东西吗?还是有一些我还没有见过的用于执行此操作的Ruby惯用语? 最佳答案 正如其他人所说,这不会改变方法定义。但是,如果要标记方法组,为什么不使用Ruby语义来标记它们呢?您可以使用
什么是Linq聚合方法的ruby等价物。它的工作原理是这样的varfactorial=new[]{1,2,3,4,5}.Aggregate((acc,i)=>acc*i);每次将数组序列中的值传递给lambda时,变量acc都会累积。 最佳答案 这在数学以及几乎所有编程语言中通常称为折叠。它是更普遍的变形概念的一个实例。Ruby从Smalltalk中继承了这个特性的名称,它被称为inject:into:(像aCollectioninject:aStartValueinto:aBlock一样使用。)所以,在Ruby中,它称为inj