Jonathan Mee
Jonathan Mee

Reputation: 38919

echo All Elements of an ItemGroup

I have an MSBuild ItemGroup and I would like to be able to echo it out in the "Post-Build Event".

However when I try commands like: echo My ItemGroup: @(Foo)

I get the error:

error MSB4164: The value "echo My ItemGroup: @(Foo)" of metadata "Command" contains an item list expression. Item list expressions are not allowed on default metadata values.

I'm not very good with ItemGroups as of yet. Is there a way I can just echo the list of files that Foo contains?

Upvotes: 1

Views: 766

Answers (2)

Zain Rizvi
Zain Rizvi

Reputation: 24636

You'll want something like:

<ItemGroup>
  <ForcedUsingFilesList Include="c:\path\to\files\*" />
</ItemGroup>
<Target Name="MyTarget">
  <PropertyGroup>
    <MyFiles>
        @(ForcedUsingFilesList->'%(FullPath)')
    </MyFiles>
  </PropertyGroup>
  <Exec>echo $(MyFiles)</Exec>
</Target>

Upvotes: 1

JDługosz
JDługosz

Reputation: 5642

Try %(Foo.Identity) instead. That will print just one item from the list, but cause the Task containing it (the Exec I suppose) to loop over the items.

If that doesn't work, be sure to work with the XML file directly rather than the IDE, in case it escapes things or puts in other code we don't see.

(later) It might be like this post, where they lament it is not simple and needs direct editing of the XML anyway. So just change it to a Exec task where the itemlist expression appears in an attribute, not a metadata definition.

It is written that the PostBuildEvent is more of a backward compatibility thing, and the good one to use is the AfterBuild target, that “is able to contain arbitrary MSBuild tasks, including one ore more Exec tasks … it doesn't have a custom UI in the IDE … edit it as XML …” Tip 43 in Brian Kretzler's book.

Upvotes: 2

Related Questions