Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MSBuild清除目录字符串_Msbuild_Relative Path_Absolute Path - Fatal编程技术网

MSBuild清除目录字符串

MSBuild清除目录字符串,msbuild,relative-path,absolute-path,Msbuild,Relative Path,Absolute Path,我在MSBuild中有一个属性,表示MSBuildProjectDirectory上方的目录: <PropertyGroup> <BuildDir>$(MSBuildProjectDirectory)\..</PRSBuildDir> </PropertyGroup> 但是它抱怨msi的路径:这个安装包无法打开。请验证该软件包是否存在以及您是否可以访问它,或者与应用程序供应商联系以验证这是一个有效的Windows Installer软件包

我在MSBuild中有一个属性,表示MSBuildProjectDirectory上方的目录:

<PropertyGroup>
    <BuildDir>$(MSBuildProjectDirectory)\..</PRSBuildDir>
</PropertyGroup>

但是它抱怨msi的路径:这个安装包无法打开。请验证该软件包是否存在以及您是否可以访问它,或者与应用程序供应商联系以验证这是一个有效的Windows Installer软件包。

我现在得到的最佳方法如下,但我想知道是否有更好的方法

<?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>
如果要计算通配符,应使用项而不是属性

<ItemGroup>
  <BuildDir Include="$(MSBuildProjectDirectory)\.."/>
</ItemGroup>

<Target Name="ExecMSIExec">
  <Exec Command="msiexec /passive /i %(BuildDir.FullPath)\Vendor\LogParser.msi"/>
</Target>

有一个,那有什么用?

删除了我的答案,因为我没有看到汤姆的答案完全相同


顺便说一句,为什么不设置Exec任务的WorkingDirectory属性,在该属性中实际调用msiexec作为MSI的位置-这样您就不会遇到路径长度问题

是的,这肯定很有用,但请注意,如果您使用..传入绝对路径。。在其中,例如$MSBuildProjectDirectory\..中,任务只会吐出相同的字符串。因此,您必须传入一个相对路径才能对其进行清理。感谢您可以使用a或in调用See的可能副本
<ItemGroup>
  <BuildDir Include="$(MSBuildProjectDirectory)\.."/>
</ItemGroup>

<Target Name="ExecMSIExec">
  <Exec Command="msiexec /passive /i %(BuildDir.FullPath)\Vendor\LogParser.msi"/>
</Target>