2010-11-04 10 views
1

J'ai essayé d'écrire un petit script pour automatiser la création de listes de lecture (m3u) pour des dizaines de dossiers/sous-dossiers de fichiers mp3/mp4, tout en omettant divers autres fichiers misc. Je connais très peu de choses sur Powershell mais j'ai réussi à reconstituer quelque chose qui fonctionne presque. Le seul point négatif est que lorsque j'utilise "$ _. Extension -eq", cela ne semble pas fonctionner, ou du moins je ne l'utilise pas correctement. Si je l'utilise pour faire correspondre des fichiers log/txt dans un dossier temp par exemple, cela fonctionne, mais pas dans ce cas. Voici le code -

$pathname = read-host "Enter path" 
$root = Get-ChildItem $pathname | ? {$_.PSIsContainer} 
$rootpath = $pathname.substring(0,2) 
Set-Location $rootpath 
Set-Location $pathname 
foreach($folder in $root) { 
Set-Location $folder 
foreach($file in $folder) { 
$txtfile =".m3u" 
$files = gci | Where-Object {$_.extension -eq ".mp3" -or ".mp4"} 
$count = $files.count 
if($count -ge 2){ 
$txtfile = "_" + $folder.name + $txtfile 
Add-Content $txtFile $files 
} 
} 
if(test-path $txtFile){ 
Add-Content $txtFile `r 
} 
Set-Location $pathname 
} 

J'ai essayé plusieurs variantes comme swapping « -match » pour « eq », mais pas de chance. incidemment, si j'omets le "-ou" .mp4 "" des parenthèses alors cela fonctionne bien, mais j'en ai besoin pour faire correspondre les deux, et seulement les deux mp3/mp4.

Merci d'avance.

Répondre

8

Pour autant que vous vous plaigniez de l'extension, commençons par cela. Vraisemblablement, il y a un bug dans le code; cette expression/syntaxe est techniquement valide:

$_.extension -eq ".mp3" -or ".mp4" 

Mais apparemment l'intention était:

$_.extension -eq ".mp3" -or $_.extension -eq ".mp4" 

Essayez l'expression corrigée dans un premier temps.

+0

Merci beaucoup. Fonctionne parfaitement maintenant! – gavin19

3

Je vais ajouter ceci comme une option raccourci:

gci | Where-Object {".mp3",".mp4" -eq $_.extension} 
+1

Je pense que l'opérateur '-contains' serait meilleur: il ne confond pas Boolean (ce n'est pas le cas pour' -eq' dans l'exemple) et vraisemblablement il devrait être plus efficace (il s'arrête au premier élément trouvé). Mais l'idée elle-même est bonne, les extensions peuvent être définies comme un tableau '$ extensions', alors nous pouvons faire cette simple vérification booléenne:' $ extensions -contains $ _. Extension'. -eq –

+0

prend également en charge les tableaux, il n'y a donc aucune différence à laquelle je puisse penser. – JasonMArcher

+1

La différence est subtile mais elle existe. 1) '-eq' renvoie une chaîne dans votre exemple, si elle existe; dans le cas général, il renvoie un tableau d'éléments correspondants. Ce n'est pas booléen du tout. 2) Par définition '-eq' doit balayer * tous * les éléments même si l'un d'entre eux a déjà été trouvé. Dans l'ensemble: '-eq 'semble plus lourd pour cette tâche que' -contains'. –

Questions connexes