2009-01-26 6 views
0

Dans ma quête pour améliorer mes compétences PowerShell, voici un exemple d'une solution laide à un problème simple. Toutes les suggestions pour améliorer l'oneliner sont les bienvenues.Filtrage et copie avec PowerShell

Mission: réduire une énorme bibliothèque d'icônes à quelque chose d'un peu plus gérable. La structure de répertoire d'origine ressemble à ceci:

 
    /Apps and Utilities 
    /Compile 
     /32 Bit Alpha png 
     /Compile 16 n p.png 
     /+ 10 or more files 
     /+ 5 more formats with 10 or more files each 
    /+ 20 or so icon names 
    /+ 22 more categories 

Je veux copier les 32 bits Alpha PNGs et aplatir la structure du répertoire un peu. Voici ma solution rapide et très sale:

 
$dest = mkdir c:\icons; gci -r | ? { $_.Name -eq '32 Bit Alph 
a png' } | % { mkdir ("$dest\" + $_.Parent.Parent.Name + "\" + $_.Parent.Name); $_ } | gci | % { cp $_. 
FullName -dest ("$dest\" + $_.Directory.Parent.Parent + "\" + $_.Directory.Parent) } 

Pas sympa, mais cela a résolu mon problème. Structure résultante:

 
    /Apps and Utilities 
    /Compile 
     /Compile 16 n p.png 
     /etc 
    /etc 
    /etc 

Comment le feriez-vous?

Répondre

0

Trois commentaires:

  • Vous n'êtes pas de tri implicitement vos résultats après votre premier test. Cela n'a probablement pas d'importance (ils seront probablement triés de toute façon) mais puisque vous construisez une structure de répertoires basée sur Parent.Parent ... je pourrais concevoir une liste d'images PNG qui causerait un tri (sans jeu de mots) d'un problème.
  • Peut-être que je suis démodé, mais je trouve dir beaucoup plus lisible que gci. Dans mes propres scripts, j'essaie généralement d'étendre la plupart des alias car cela tend à améliorer la lisibilité et la maintenabilité de ceux qui sont plus récents pour PowerShell. Au lieu de simplement tout enchaîner, il est logique de séparer les morceaux en variables et de les encapsuler dans une cmdlet/fonction.
+0

Regardera dans le tri. Lorsque j'écris des scripts, je développe la plupart des alias, mais j'aime que mes oneliners soient concis - ls (ou dir) sont de bien meilleurs choix que gci si :). – Bergius