ファイルのリストを「ループ」(バッチ処理) しようとしています。string.root ディレクトリ名を別のディレクトリ名に置き換えます。
このプロジェクトは 3.5 を使用しているため、一部の新しい 4.0 機能を十分に活用できません。
MSBuild.ExtensionPack.Framework.TextString タスクを使用しています ( http://msbuildextensionpack.codeplex.com/releases/57599/download/229487から )
基本的にファイル名を書き換えたい
c:\SomeFolder\myfile.txt
to
c:\AnotherFolder\myfile.txt
問題を示すためにモックを作成しました。
ここに私が得ている結果があります:
"C:\Windows\twunk_16.exe" "c:\WindowsFake\write.exe"
"C:\Windows\twunk_32.exe" "c:\WindowsFake\write.exe"
"C:\Windows\winhlp32.exe" "c:\WindowsFake\write.exe"
"C:\Windows\write.exe" "c:\WindowsFake\write.exe"
"c:\WindowsFake\write.exe" (右側) がバッチ内の各項目に対して繰り返されていることがわかります。:<
私が取得しようとしているもの:
"C:\Windows\twunk_16.exe" "c:\WindowsFake\twunk_16.exe"
"C:\Windows\twunk_32.exe" "c:\WindowsFake\twunk_32.exe"
"C:\Windows\winhlp32.exe" "c:\WindowsFake\winhlp32.exe"
"C:\Windows\write.exe" "c:\WindowsFake\write.exe"
繰り返し値を取得している理由を(ちょっと)理解しています。しかし、(もちろん) 問題に対処する方法を理解することはできません。「windows」「fakewindows」にとらわれないでください。ほとんどの人は自分のコンピューターに ac:\windows ディレクトリがあり、いくつかのファイルを「取得」する必要があったため、これらは私が作成した単なる模擬例です。
繰り返しますが、私は 4.0 ではなく 3.5 MSBuild を使用しています。
set msBuildDir=%WINDIR%\Microsoft.NET\Framework\v3.5
call %msBuildDir%\msbuild.exe Master_MSBuild.xml /p:Configuration=Release /l:FileLogger,Microsoft.Build.Engine;logfile=Master_MSBuild_LOG.log
set msBuildDir=
完全な .msbuild コードを次に示します。(これは「Master_MSBuild.xml」というファイルにあります。)
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="AllTargetsWrapper">
<!-- -->
<!-- -->
<UsingTask AssemblyFile=".\MSBuild.ExtensionPack.dll" TaskName="MSBuild.ExtensionPack.Framework.TextString" />
<!-- -->
<!-- -->
<PropertyGroup>
<WindowsForRealDirectory>$(windir)</WindowsForRealDirectory>
<WindowsFakeDirectory>c:\WindowsFake</WindowsFakeDirectory>
</PropertyGroup>
<!-- -->
<!-- -->
<Target Name="DetermineAllFilesTarget">
<!-- -->
<ItemGroup>
<MyExcludedFiles Include="$(WindowsForRealDirectory)\**\notepad.exe" />
<MyExcludedFiles Include="$(WindowsForRealDirectory)\**\b*.exe" />
<MyExcludedFiles Include="$(WindowsForRealDirectory)\**\e*.exe" />
<MyExcludedFiles Include="$(WindowsForRealDirectory)\**\f*.exe" />
</ItemGroup>
<!-- -->
<ItemGroup>
<MyIncludedFiles Include="$(WindowsForRealDirectory)\Microsoft.NET\*.exe" Exclude="@(MyExcludedFiles)" />
<MyIncludedFiles Include="$(WindowsForRealDirectory)\*.exe" Exclude="@(MyExcludedFiles)" />
</ItemGroup>
<!-- -->
<!-- This create item may be redundant. -->
<CreateItem Include="@(MyIncludedFiles)">
<Output TaskParameter="Include" ItemName="FoundFolders" />
</CreateItem>
<!-- -->
<!-- -->
<Message Text="rootdir: @(FoundFolders->'%(rootdir)')" />
<Message Text="fullpath: @(FoundFolders->'%(fullpath)')" />
<Message Text="rootdir + directory + filename + extension: @(FoundFolders->'%(rootdir)%(directory)%(filename)%(extension)')" />
<Message Text="identity: @(FoundFolders->'%(identity)')" />
<Message Text="filename: @(FoundFolders->'%(filename)')" />
<Message Text="directory: @(FoundFolders->'%(directory)')" />
<Message Text="relativedir: @(FoundFolders->'%(relativedir)')" />
<Message Text="extension: @(FoundFolders->'%(extension)')" />
<!-- -->
</Target>
<!-- -->
<!-- -->
<!-- -->
<Target Name="ReplaceAndShowAllFileNames" Inputs="@(FoundFolders)" Outputs="@(FoundFolders.Identity')">
<!-- -->
<Message Text=" " />
<Message Text="FoundFolders.FileName = %(FoundFolders.FileName)" />
<Message Text="FoundFolders.FullPath = %(FoundFolders.FullPath)" />
<Message Text=" rootdir + directory + filename + extension = '%(FoundFolders.rootdir) *** %(FoundFolders.directory) *** %(FoundFolders.filename) *** %(FoundFolders.extension)' " />
<Message Text="FoundFolders.rootdir = %(FoundFolders.rootdir)" />
<Message Text="FoundFolders.directory = %(FoundFolders.directory)" />
<Message Text="FoundFolders.relativedir = %(FoundFolders.relativedir)" />
<Message Text="FoundFolders.extension = %(FoundFolders.extension)" />
<Message Text="FoundFolders.recursivedir = %(FoundFolders.recursivedir)" />
<Message Text=" " />
<Message Text=" " />
<Message Text=" " />
<!-- -->
<Message Text=" (WindowsFakeDirectory)= $(WindowsFakeDirectory)" />
<!-- -->
<!-- Replace the contents of a string -->
<MSBuild.ExtensionPack.Framework.TextString TaskAction="Replace" OldString="%(FoundFolders.relativedir)%(FoundFolders.Filename)%(FoundFolders.Extension)" OldValue="$(WindowsForRealDirectory)" NewValue="$(WindowsFakeDirectory)">
<Output PropertyName="RewrittenFileName" TaskParameter="NewString" />
</MSBuild.ExtensionPack.Framework.TextString>
<!-- -->
<CreateProperty Value="$(CheckedOutFileName)">
<Output PropertyName="CheckedOutFileNameTwo" TaskParameter="Value" />
</CreateProperty>
<!-- -->
<Message Text=" " />
<Message Text="The Result of the String.Replace: $(RewrittenFileName)" />
<!-- -->
<Message Text=" " />
<Message Text="Command: "The original and the rewritten file name: " "%(FoundFolders.relativedir)%(FoundFolders.Filename)%(FoundFolders.Extension)" "$(RewrittenFileName)"" />
<!-- -->
</Target>
<!-- -->
<!-- -->
<!-- -->
<Target Name="AllTargetsWrapper">
<!-- -->
<CallTarget Targets="DetermineAllFilesTarget" />
<!-- -->
<CallTarget Targets="ReplaceAndShowAllFileNames" />
<!-- -->
</Target>
<!-- -->
</Project>