1

画像ファイルを jpg から png に変換するアイテム変換について説明しているこの回答に基づいて、.docx ファイルを .pdf に変換するアイテム変換を作成しました。projectname.proj ビルド ファイルから呼び出すと、次のエラー メッセージが表示されます。

Error   1   The condition " '%(Extension)' == '.docx' " on the
"WordToPdf" target has a reference to item metadata. References to item 
metadata are not allowed in target conditions unless they are part of an item
transform. [project path]\.build\WordToPdf.Tasks.target 7   9

どうすればこれを機能させることができますか?

ここに私の目標があります:

    <?xml version="1.0" encoding="utf-8" ?>
    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <!-- $Id$ -->
      <Target Name="WordToPdf"
            Inputs="@(Content)"
            Outputs="@(Content -> '%(RootDir)%(Directory)%(Filename).pdf' )"
            Condition=" '%(Extension)' == '.docx' ">
        <ItemGroup>
          <Sublist Include="@(Content)" Condition=" '%(Extension)' == '.docx' " />
        </ItemGroup>
        <PropertyGroup>
          <PowerShellExe Condition=" '$(PowerShellExe)'=='' ">%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe</PowerShellExe>
          <ScriptLocation Condition=" '$(ScriptLocation)'=='' ">.\WordToPdf.ps1</ScriptLocation>
        </PropertyGroup>

        <Exec Command="$(PowerShellExe) -NonInteractive -executionpolicy Unrestricted -command &quot;&amp; {&amp;&apos;$(ScriptLocation)&apos; -WordFilename &apos;/Input:%(Sublist.FullPath)&apos; }&quot;" />

        <Content Remove="@(Sublist)" />
        <Content Include="@(Sublist -> '%(RootDir)%(Directory)%(Filename).pdf' )" />
      </Target>
    </Project>

次のように、BeforeBuild ターゲットの projectname.proj ファイルから呼び出します。

  <Import Project="$(MSBuildTasksPath)\WordToPdf.Tasks.target" />

  ....

  <Target Name="BeforeBuild">
    <CallTarget Targets="WordToPdf" />
  </Target>

アップデート

変換を機能させるための回避策だけでなく、このターゲットにはもう少し問題がありました。今後の参考のために、最終的な作業コードを次に示します。

<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- $Id$ -->
  <Target Name="WordToPdf"
      Inputs="@(ContentFiltered)"
      Outputs="@(ContentFiltered -> '%(RootDir)%(Directory)%(Filename).pdf' )"
      DependsOnTargets="FilterContent">
    <PropertyGroup>
      <PowerShellExe Condition=" '$(PowerShellExe)'=='' ">%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe</PowerShellExe>
      <ScriptLocation Condition=" '$(ScriptLocation)'=='' ">.\WordToPdf.ps1</ScriptLocation>
    </PropertyGroup>

    <Exec Command="$(PowerShellExe) -NonInteractive -executionpolicy Unrestricted -command &quot;&amp; {&amp;&apos;$(ScriptLocation)&apos; -WordFilename &apos;%(ContentFiltered.FullPath)&apos; }&quot;" />

    <ItemGroup>
      <Content Remove="@(ContentFiltered)" />
      <Content Include="@(ContentFiltered -> '%(RootDir)%(Directory)%(Filename).pdf' )" />
    </ItemGroup>
  </Target>
  <!-- New target to pre-filter list -->
  <Target Name="FilterContent">
    <ItemGroup>
      <ContentFiltered Include="@(Content)" Condition="'%(Extension)' == '.docx'" />
    </ItemGroup>
  </Target>

</Project>

そして、「msbuild word から pdf アイテムへの変換」を検索してここに来た人のために、これが私の powershell スクリプトです。

Param(
  [string]$WordFilename
)
$Word = New-Object -comobject Word.Application
$Doc=$Word.Documents.Open($WordFilename)
$Doc.saveas([ref](($WordFilename).replace("docx","pdf")), [ref]17)
$Doc.close()

.docx ファイルをコンテンツとしてプロジェクトに追加します。新しい場合はコピーします。docx ファイルの方が新しい場合は pdf ファイルが作成され、pdf ファイルがその出力場所にコピーされます。

4

1 に答える 1

1

条件に基づいてアイテムを事前にフィルター処理する別のターゲットを作成することで、これを回避できます。実際には、新しいリストを作成します。

これがサンプルです - 新しいDependsOnTargetsタグと変更されたContentFiltered名前に注意してください:

  <Target Name="WordToPdf"
        Inputs="@(ContentFiltered)"
        Outputs="@(ContentFiltered -> '%(RootDir)%(Directory)%(Filename).pdf' )"
        DependsOnTargets="FilterContent">
    <!-- 
      ...
      your actual target body here 
      ...
      -->
  </Target>

  <!-- New target to pre-filter list -->
  <Target Name="FilterContent">
    <ItemGroup>
      <ContentFiltered Include="@(Content)" Condition="'%(Extension)' == '.docx'" />
    </ItemGroup>
  </Target>
于 2013-04-26T13:05:37.140 に答える