“$_.extension -eq” ne fonctionne pas comme prévu?
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 mp3/mp4 fichiers, tout en omettant divers divers autres fichiers qui y sont. Je sais très peu de choses sur Powershell, mais a réussi à reconstituer quelque chose qui fonctionne presque. La seule anomalie est que lorsque j'utilise "$_.extension -eq", il ne semble pas fonctionner, ou, au moins, je ne suis pas à l'utiliser. Si je l'utiliser pour correspondre log/txt dans un dossier temp par exemple, cela fonctionne, mais pas dans la présente instance. 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 la permutation de "match" pour "-eq" mais pas de chance. d'ailleurs, si j'ai omis le "ou ".mp4"" dans les parenthèses puis il fonctionne très bien, mais j'en ai besoin pour correspondre à tous les deux, et seulement deux mp3/mp4.
Merci d'avance.
Vous devez vous connecter pour publier un commentaire.
Aussi loin que de vous plaindre au sujet de l'extension, nous allons commencer avec elle. Sans doute il y a un bug dans le code; cette expression/syntaxe est techniquement valides:
Mais apparemment l'intention était:
Essayer de la correction de l'expression au premier abord.
Je vais ajouter cela comme une option de raccourci:
-contains
serait mieux: il n'est pas source de confusion Booléenne (c'est pas le cas pour la-eq
dans l'exemple) et sans doute il doit être plus efficace (il s'arrête au premier point). Mais l'idée en soi est bonne, les extensions peuvent être définis comme un tableau$extensions
alors nous pouvons faire ce Booléenne simple de vérifier:$extensions -contains $_.extension
.-eq
retourne une chaîne de caractères dans votre exemple, si elle existe; dans le cas général, il renvoie un tableau de correspondance des éléments. Ce n'est pas Booléenne à tous. 2) Par définition,-eq
a pour numériser tous les éléments, même si on a déjà été trouvé. Dans l'ensemble:-eq
semble plus lourd pour cette tâche que-contains
.if ('', 'xxx' -eq '') { 'found' } else { 'not found' }
et ceif ('', 'xxx' -contains '') { 'found' } else { 'not found' }
. Les résultats sont différents.