2010-03-12 6 views
4

J'essaie d'écrire un script MsBuild pour compresser certains fichiers. J'ai besoin de sélectionner tous les fichiers en lecture seule récursivement d'un dossier dans un ItemGroup à ajouter au fichier zip. J'utilise la tâche Zip de tâches de communauté, mais j'ai du mal à sélectionner les fichiers en fonction de leurs attributs.Comment sélectionner tous les fichiers en lecture seule avec msbuild?

Y at-il quelque chose autour de faire cela hors de la boîte, ou ai-je besoin d'écrire une tâche personnalisée?

Merci pour votre aide.

Répondre

0

Cela semble faire l'affaire avec un peu d'utilisation de ligne de commande sale.

<Exec Command="dir .\RelPath\ToFolder\ToSearchIn /S /AR /B > readonlyfiles.temp.txt"/> 
<ReadLinesFromFile File="readonlyfiles.temp.txt"> 
    <Output TaskParameter="Lines" ItemName="ReadOnlyFiles"/> 
</ReadLinesFromFile> 
<Delete Files="readonlyfiles.temp.txt"/> 

Cela donne des chemins absolus aux fichiers.

Pour obtenir des chemins relatifs, essayez quelque chose comme ceci:

<Exec Command="dir .\RelPath\ToFolder\ToSearchIn /S /AR /B > readonlyfiles.temp.txt"/> 
<FileUpdate Files="readonlyfiles.temp.txt" 
      Multiline="True" 
      Regex="^.*\\RelPath\\ToFolder\\ToSearchIn" 
      ReplacementText="RelPath\ToFolder\ToSearchIn" 
      /> 
<ReadLinesFromFile File="readonlyfiles.temp.txt"> 
    <Output TaskParameter="Lines" ItemName="ReadOnlyZipFiles"/> 
</ReadLinesFromFile> 
<Delete Files="readonlyfiles.temp.txt"/> 
0

Avez-vous regardé les tâches de construction de communauté site?

Il a une tâche zip et une tâche de changement d'attribut - ils devraient vous en tirer le meilleur parti.

+0

Salut, oui, j'aurais dû dire - J'utilise leur tâche Zip. Comme vous le dites, la tâche Attrib va ​​changer les attributs, mais je ne veux pas les changer, je veux juste sélectionner les fichiers en fonction de leurs attributs. –

3

Vous pouvez utiliser Property Functions (ajouté à msbuild 4) pour savoir si un fichier est en lecture seule comme ceci:

<ItemGroup> 
    <MyFiles Include="Testing\*.*" > 
    <ReadOnly Condition='1 == $([MSBuild]::BitwiseAnd(1, $([System.IO.File]::GetAttributes("%(Identity)"))))'>True</ReadOnly> 
    </MyFiles> 
</ItemGroup> 

<Target Name="Run" Outputs="%(MyFiles.Identity)"> 
    <Message Text="%(MyFiles.Identity)" Condition="%(MyFiles.ReadOnly) != True"/> 
    <Message Text="%(MyFiles.Identity) ReadOnly" Condition="%(MyFiles.ReadOnly) == True" /> 
</Target> 
+0

Juste essayé ceci, mais j'obtiens l'erreur MSB4184: L'expression "[System.IO.File] :: GetAttributes ('')" ne peut pas être évaluée. Le chemin n'est pas d'une forme légale. Il semble que% (Identity) se développe en une chaîne vide. J'utilise ToolsVersion = "12.0". –

+0

Pouvez-vous me dire comment vous exécutez le fichier msbuild? Est-ce à partir de la ligne de commande? –

+0

Je suis capable de faire le script ci-dessus très bien. Peut-être qu'il y a quelque chose de différent dans la façon dont vous l'avez exécuté ou comment vous avez écrit le script. Il pourrait être préférable de poster une question distincte avec le script msbuild. –

Questions connexes