3

ビルド スクリプトの一部として、サブディレクトリからユーザー メッセージ ファイルをコピーし、サブディレクトリの名前をメッセージ ファイルに追加します。つまり、msg\0\message.std > msg\message0.std

使ってみました

<Copy SourceFiles="@(MessageFiles)" 
DestinationFiles="@(MessageFiles->'$(BuildRoot)\%(Filename)%(RecursiveDir)%(Extension)'"/>

ただし、これはファイルを ..\message0.std にコピーしようとします。

%(RecursiveDir) の末尾の「\」を抑制するか、別の方法で宛先名を構成する方法はありますか?

4

1 に答える 1

7

次のようなことができます。

<Target Name="DoIt">
    <ItemGroup>
        <MessageFiles2 Include="@(MessageFiles)">
            <SubDir>$([System.IO.Path]::GetFileName($([System.IO.Path]::GetDirectoryName(%(MessageFiles.RecursiveDir)))))</SubDir>
        </MessageFiles2>
    </ItemGroup>

    <Message Text="@(MessageFiles2->'$(BuildRoot)\%(Filename)%(SubDir)%(Extension)')"/>

</Target>

または、あなたの仕事を維持しようとする人の心を爆破したい場合:

<Target Name="DoIt">
    <Message Text="@(MessageFiles->'$(BuildRoot)\%(Filename)$([System.IO.Path]::GetFileName($([System.IO.Path]::GetDirectoryName($([System.String]::Copy('%(MessageFiles.RecursiveDir)'))))))%(Extension)')"/>
</Target>

これは完全な解決策ではありませんが、ここから始めることができます。RecursiveDirまた、が空の場合、つまりメッセージ ファイルが直接ルート フォルダにある場合、上記の両方の例が機能しなくなることに注意してください。
詳細については、MSBuild プロパティ関数のブログ投稿を参照してください。

問題を処理する別の方法として、いつでもCustom Taskを作成できます。

于 2012-05-30T14:57:49.077 に答える