我在MSBuild中有一个属性来表示MSBuildProjectDirectory上面的目录:
<PropertyGroup>
<BuildDir>$(MSBuildProjectDirectory)\..</PRSBuildDir>
</PropertyGroup>
我需要使用此属性,但我需要清理目录字符串,以便它不包含..
。换句话说,我需要..
求值,所以如果当前项目文件在C:\Test\Tom\MyDir
中,那么我需要一个包含字符串C:\Test\Tom
的属性。
我问的原因是因为我正在尝试运行这样的命令:
msiexec /passive /i "D:\Build\2.3.84.40394\Deployment\..\Vendor\LogParser.msi"
但它正在抱怨msi的路径:This installation package could not be opened. Verify that the package exists and that you can access it, or contact the application vendor to verify that this is a valid Windows Installer package.
答案 0 :(得分:2)
有ConvertToAbsolutePath task,有什么用?
答案 1 :(得分:1)
我现在所掌握的最佳方法如下,但我想知道是否有更好的方法......
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<BuildDir>$(MSBuildProjectDirectory)\..</BuildDir>
</PropertyGroup>
<Target Name="Test">
<ItemGroup>
<CleanBuildDir Include="$(BuildDir)" />
</ItemGroup>
<PropertyGroup>
<BuildDir>%(CleanBuildDir.FullPath)</BuildDir>
</PropertyGroup>
<Message Text="$(BuildDir)" />
</Target>
</Project>
答案 2 :(得分:1)
如果您想评估通配符,则应使用项目而不是属性。
<ItemGroup>
<BuildDir Include="$(MSBuildProjectDirectory)\.."/>
</ItemGroup>
<Target Name="ExecMSIExec">
<Exec Command="msiexec /passive /i %(BuildDir.FullPath)\Vendor\LogParser.msi"/>
</Target>
答案 3 :(得分:1)
(删除了我的答案,因为我没有看到Tom以完全相同的方式回答!)
顺便说一句,为什么不设置Exec任务的“WorkingDirectory”属性,你实际上将msiexec称为MSI的位置 - 这样你就不会遇到路径长度问题