Mais que fait la police?
brucine Messages postés 17673 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 14 novembre 2024 - 16 oct. 2024 à 09:02
4 réponses
Modifié le 25 sept. 2024 à 12:07
Bonjour brucine,
Voici un script PS maison qui fait le travail sur mon W10 :
cls Write-Host "`n###################################`n## Recherche des polices tierces ##`n###################################`n" Write-Host "Liste des polices natives a Windows `n`n Patientez..." $windowsFonts = Get-ChildItem "C:\Windows\Fonts" -Include *.ttf, *.otf, *.fon Write-Host " Ok !`n" Write-Host "Liste des polices dans les dossiers *\Fonts `n`n Patientez..." function ListerToutesLesPolices { Get-ChildItem "C:\" -Recurse -Directory -Filter *Fonts* -ErrorAction SilentlyContinue | ForEach-Object { Get-ChildItem $_.FullName -Recurse -Include *.ttf, *.otf, *.fon } } # Supprimer les polices natives de la liste de toutes les polices $policesTierces = ListerToutesLesPolices | Where-Object { -not ($windowsFonts.Name -contains $_.Name) -and $_.DirectoryName -ne "C:\Windows\Fonts" } Write-Host " Ok !`n" Write-Host "Liste des repertoires uniques :`n`n" $repertoiresPolices= $policesTierces | Select-Object -ExpandProperty DirectoryName -Unique if ($repertoiresPolices) { $repertoiresPolices| Format-Table } else { Write-Host "Aucune police tierce n'a ete trouvee." }
Tiens au jus !
EDIT 12:06
25 sept. 2024 à 12:58
Bonjour,
@: brucine:
Sinon, avec "EveryThing", en entrant "font", ça te liste avec les endroits où elles sont.
Modifié le 15 oct. 2024 à 11:33
Bonjour
Je n'ai pas oublié ton tri fastidieux et ça m'a été un challenge sympa.
Pour t'aider dans le tri des polices, voici un script PS maison qui parcourt les métadonnées des fichiers parmi les répertoires en paramètre. Si un chemin est invalide, il le dit. Tu peux ajouter facilement un autre répertoire dans la liste.
# Point d'entrée en bas du fichier # Fonction pour rechercher les fichiers de police contenant la chaîne en entrée function TrouverFichiersPolice { param ( [string]$nomPolice ) $erreurs = @() $resultats = @() # Liste des dossiers où les polices sont généralement stockées $repertoiresPolices = @( "C:\Windows\Fonts", "C:\Program Files\Microsoft Office\root\vfs\Fonts", "C:\Program Files\WindowsApps\Microsoft.GillSansNova_1.0.1.0_neutral__8wekyb3d8bbwe", "$env:LOCALAPPDATA\Microsoft\Windows\Fonts", "$env:LOCALAPPDATA\Microsoft\FontCache\4\CloudFonts" ) # Pour chaque répertoire de la liste foreach ($repertoire in $repertoiresPolices) { try { if (Test-Path -Path $repertoire) { $polices = Get-ChildItem -Path $repertoire -ErrorAction Stop # Pour chaque fichier foreach ($police in $polices) { try { $fontCollection = New-Object System.Drawing.Text.PrivateFontCollection $fontCollection.AddFontFile($police.FullName) # Recherche dans les métadonnées du fichier et non dans le nom foreach ($family in $fontCollection.Families) { if ($family.Name -like "*$nomPolice*") { $resultats += "| $($family.Name) - Fichier : $($repertoire)\$($police.Name)" } } } catch { $erreurs += "Erreur lors de la lecture des propriétés du fichier $($repertoire)\$($police.Name) : $($_.Exception.Message)" } } } else { $erreurs += "Le répertoire '$repertoire' n'existe pas." } } catch { $erreurs += "Erreur lors de l'accès au répertoire $repertoire : $($_.Exception.Message)" } } if ($resultats.Count -gt 0) { Write-Host "" Write-Host "##############################" Write-Host "# Résultats trouvés : #" Write-Host "##############################" Write-Host "" $resultats | ForEach-Object { Write-Host $_ } } else { Write-Host "" Write-Host "##############################" Write-Host "# Aucun résultat pour '$nomPolice'." Write-Host "##############################" Write-Host "" } # Afficher les erreurs si elles existent avec un formatage agréable if ($erreurs.Count -gt 0) { Write-Host "" Write-Host "##############################" Write-Host "# Erreurs rencontrées : #" Write-Host "##############################" Write-Host "" $erreurs | ForEach-Object { Write-Host "| $_" } } } # Charger l'assembly pour accéder aux métadonnées des fichiers Add-Type -AssemblyName System.Drawing # Point d'entrée, saisie de tout ou partie du nom de la police à rechercher while ($true) { Write-Host "" Write-Host "##############################" $nomPolice = Read-Host "# Entrez tout ou partie du nom de la police tel qu'affiché dans Word (ex: Arial, ding, Bahnschrift)" Write-Host "##############################" TrouverFichiersPolice -nomPolice $nomPolice }
15 oct. 2024 à 11:32
Bonjour,
Supposons, pourquoi pas, que je cherche des chinoiseries "Ya".
La liste des polices de Windows Fonts m'est bien rendue.
Le script me répond que le répertoire vfs n'existe pas, ce qui est inexact; les polices y sont dans un sous-dossier private du dossier Fonts, rappelons qu'il ne s'agit pas du dossier des polices réelles, mais de celui permettant de les installer dans Office, elle sont au format Dos 8+3 différent de leur nom réel qui n'apparaît que dans leurs propriétés, il ne semble pas s'y trouver de chinoiserie mais ce qui n'explique pas le phénomène sauf si la recherche ne se fait pas dans le sous-dossier.
Même réponse pour GillSansNova mais là c'est normal, je l'ai virée.
Les CloudFonts sont bien à l'endroit indiqué, mais dans autant de sous-dossiers qu'il y a de polices et leurs déclinaisons (Aptos, Aptos Narrow...) où elles n'ont qu'un nom cette fois-ci numérique, le vrai apparaissant toujours dans propriétés; la recherche "Ya" n'en ramènerait là aussi rien non plus puisque pas de chinoiseries, mais elle échoue "erreur lors de la lecture des propriétés du fichier: Aptos", sans doute parce qu'elle intercepte un nom de dossier et non pas de fichier.
Modifié le 15 oct. 2024 à 12:27
EDIT je ne peux pas retoucher le script à 1 minute près.
S'il répond "le répertoire vfs n'existe pas" c'est qu'il faut vérifier manuellement le chemin saisi, c'est l'erreur du test de validité avant le parcours des fichiers.
Je te remets la version légèrement corrigée pour gérer la récursivité et masquer les erreurs en cas de rencontre d'un dossier :
# Point d'entrée en bas du fichier # Fonction pour rechercher les fichiers de police contenant la chaîne en entrée function TrouverFichiersPolice { param ( [string]$nomPolice ) $erreurs = @() $resultats = @() # Liste des dossiers où les polices sont généralement stockées $repertoiresPolices = @( "C:\Windows\Fonts", "C:\Program Files\Microsoft Office\root\vfs\Fonts", "C:\Program Files\WindowsApps\Microsoft.GillSansNova_1.0.1.0_neutral__8wekyb3d8bbwe", "$env:LOCALAPPDATA\Microsoft\Windows\Fonts", "$env:LOCALAPPDATA\Microsoft\FontCache\4\CloudFonts" ) # Pour chaque répertoire de la liste foreach ($repertoire in $repertoiresPolices) { try { if (Test-Path -Path $repertoire) { $polices = Get-ChildItem -Path $repertoire -Recurse -ErrorAction Continue # Pour chaque fichier foreach ($police in $polices) { $fontCollection = New-Object System.Drawing.Text.PrivateFontCollection $fontCollection.AddFontFile($police.FullName) # Recherche dans les métadonnées du fichier et non dans le nom foreach ($family in $fontCollection.Families) { if ($family.Name -like "*$nomPolice*") { $resultats += "| $($family.Name) - Fichier : $($repertoire)\$($police.Name)" } } } } else { $erreurs += "Le répertoire '$repertoire' n'existe pas." } } catch { $erreurs += "Erreur lors de l'accès au répertoire $repertoire : $($_.Exception.Message)" } } # Afficher les résultats si ils existent if ($resultats.Count -gt 0) { Write-Host "" Write-Host "##############################" Write-Host "# Résultats trouvés : #" Write-Host "##############################" Write-Host "" $resultats | ForEach-Object { Write-Host $_ } } else { Write-Host "" Write-Host "##############################" Write-Host "# Aucun résultat pour '$nomPolice'." Write-Host "##############################" Write-Host "" } # Afficher les erreurs si elles existent if ($erreurs.Count -gt 0) { Write-Host "" Write-Host "##############################" Write-Host "# Erreurs rencontrées : #" Write-Host "##############################" Write-Host "" $erreurs | ForEach-Object { Write-Host "| $_" } } } # Charger l'assembly pour lire les métadonnées des fichiers Add-Type -AssemblyName System.Drawing # Point d'entrée, saisie de tout ou partie du nom de la police à rechercher while ($true) { Write-Host "" Write-Host "##############################" $nomPolice = Read-Host "# Entrez tout ou partie du nom de la police tel qu'affiché dans Word (ex: Arial, ding, Bahnschrift)" Write-Host "##############################" TrouverFichiersPolice -nomPolice $nomPolice }
15 oct. 2024 à 13:55
edited (comme souvent, je devrais plus "Prévisualiser")
15 oct. 2024 à 14:22
Pas vraiment mieux:
Le répertoire 'C:\Program Files\Microsoft Office\root\vfs\Fonts' n'existe pas.
Le répertoire 'C:\Program Files\WindowsApps\Microsoft.GillSansNova_1.0.1.0_neutral__8wekyb3d8bbwe' n'existe pas.
Erreur lors de l'accès au répertoire C:\Users\brucine\AppData\Local\Microsoft\FontCache\4\CloudFonts : Exception lors de l'appel de « AddFontFile » avec « 1 » argument(s) : « Une erreur générique s'est produite dans GDI+. »
Modifié le 15 oct. 2024 à 19:18
Okay.
Pour les "répertoire n'existe pas", tape les chemins dans l'explorateur et corrige dans le script, c'est saisi à la main pour éviter de perdre 10 min en bouclant sur C:
Pour l'erreur rencontrée, je la catch mais je ne reproduis pas ça chez moi.
# Point d'entrée en bas du fichier # Fonction pour rechercher les fichiers de police contenant la chaîne en entrée function TrouverFichiersPolice { param ( [string]$nomPolice ) $erreurs = @() $resultats = @() # Liste des dossiers où les polices sont généralement stockées $repertoiresPolices = @( "C:\Windows\Fonts", "C:\Program Files\Microsoft Office\root\vfs\Fonts", "C:\Program Files\WindowsApps\Microsoft.GillSansNova_1.0.1.0_neutral__8wekyb3d8bbwe", "$env:LOCALAPPDATA\Microsoft\Windows\Fonts", "$env:LOCALAPPDATA\Microsoft\FontCache\4\CloudFonts" ) # Pour chaque répertoire de la liste foreach ($repertoire in $repertoiresPolices) { try { if (Test-Path -Path $repertoire) { $polices = Get-ChildItem -Path $repertoire -Recurse -ErrorAction Continue # Pour chaque fichier foreach ($police in $polices) { try { $fontCollection = New-Object System.Drawing.Text.PrivateFontCollection $fontCollection.AddFontFile($police.FullName) # Recherche dans les métadonnées du fichier et non dans le nom foreach ($family in $fontCollection.Families) { if ($family.Name -like "*$nomPolice*") { $resultats += "| $($family.Name) - Fichier : $($repertoire)\$($police.Name)" } } } catch { $erreurs += "Erreur lors du chargement de la police '$($police.Name)' à partir de '$($repertoire)\$($police.FullName)' : $($_.Exception.Message)" } } } else { $erreurs += "Le répertoire '$repertoire' n'existe pas." } } catch { $erreurs += "Erreur lors de l'accès au répertoire $repertoire : $($_.Exception.Message)" } } if ($resultats.Count -gt 0) { Write-Host "" Write-Host "##############################" Write-Host "# Résultats trouvés : #" Write-Host "##############################" Write-Host "" $resultats | ForEach-Object { Write-Host $_ } } else { Write-Host "" Write-Host "##############################" Write-Host "# Aucun résultat pour '$nomPolice'." Write-Host "##############################" Write-Host "" } # Afficher les erreurs si elles existent avec un formatage agréable if ($erreurs.Count -gt 0) { Write-Host "" Write-Host "##############################" Write-Host "# Erreurs rencontrées : #" Write-Host "##############################" Write-Host "" $erreurs | ForEach-Object { Write-Host "| $_" } } } # Charger l'assembly pour accéder aux métadonnées des fichiers Add-Type -AssemblyName System.Drawing # Point d'entrée, saisie de tout ou partie du nom de la police à rechercher while ($true) { Write-Host "" Write-Host "##############################" $nomPolice = Read-Host "# Entrez tout ou partie du nom de la police tel qu'affiché dans Word (ex: Arial, ding, Bahnschrift)" Write-Host "##############################" TrouverFichiersPolice -nomPolice $nomPolice }
Cela dit, ça t'aide à minima pour faire du ménage ? Tu veux le voir creuser autrement ?
16 oct. 2024 à 09:02
Bonjour,
Je suis beaucoup moins à l'aise avec PowerShell qu'avec Batch et de toute façon la question est vraiment pour le sport, mais pourquoi pas: si j'ai une police "parasite" dans Word, j'aurai son nom en entier et je n'ai pas besoin de chercher une partie de la chaîne à n'importe quel emplacement (par exemple ria pour Arial).
On a donc une solution plus simple à écrire en Batch en cherchant une variable correspondant au nom y compris du début de la police à cela près que dans un cas comme dans l'autre je ne peux pas rechercher sauf en passant par un utilitaire tiers la métadonnée titre d'une police de CloudFonts où par exemple 27160079615.ttf correspond à Aptos Bold et sous réserve que les fichiers en question puissent servir au quotidien dans Word (ce n'est pas le cas de ceux dans vfs ou dans Windows SXS que le Batch va ramener si on ne précise pas les dossiers).
Pour revenir à nos moutons, ta syntaxe est toujours en erreur sur vfs (le dossier n'existe pas) même si je spécifie private après Fonts, alors que le contenu m'est bien rendu sous Batch.
De manière similaire, la recherche sur Aptos (CloudFonts) échoue sauf si je spécifie le dossier après CloudFonts (aptos), mais ce qui n'a pas beaucoup de sens parce que la valeur peut être aussi Ms Mincho ou ce qu'on voudra: il faudrait que le terme de recherche entré (Aptos) soit capable de chercher sous CloudFonts ce qui n'est pas un nom de fichier mais de dossier et de retourner les fichiers dans ce dossier (ou bien sûr d'y chercher non pas le nom mais la métadonnée).
J'ai fait le ménage à la main, mais on peut bien sûr continuer pour le sport à envisager un script qui ne retournerait pas ces erreurs.
25 sept. 2024 à 12:11
Bonjour,
J'entends bien, mais le but n'est pas de supprimer toutes les polices non natives Windows.
En dehors de polices mises en place en dehors du dossier Fonts par certains logiciels (par exemple Adobe, je n'ai pas cet article), certaines sont légitimes (comme par exemple Garamond qui de mémoire est mis en place formellement non pas par Windows mais par Office).
25 sept. 2024 à 12:14
J'ai un peu de mal à saisir le fond du problème.
A minima mon script ne fait que lister sans rien toucher pour donner une idée des dossiers et potentiellement des logiciels concernés si les noms de dossiers sont suffisamment clairs.
Je ne sais pas identifier une police légitime d'une illégitime, tu peux expliquer ce que tu attends concrètement ?
25 sept. 2024 à 12:45
C'est moi qui ne te suis pas, ton script liste les polices se trouvant ailleurs que dans le dossier Fonts (d'ailleurs pas toutes).
Elles peuvent être soit système (dossiers de démarrage, applications...), soit permettant d'afficher le menu de tel logiciel tiers (c'est le cas de certaines polices dans le dossier Word, Firefox...), soit être choisies dans le logiciel en question (c'est de mémoire le cas des fameuses police Adobe).
Dans le cas qui m'intéresse, j'ai l'impression à tort ou à raison alors que Word n'embarque aucune police de rédaction dans un dossier tiers que quand j'en choisis dans Word, certaines y sont proposées alors qu'elles sont absentes du dossier Fonts.
25 sept. 2024 à 12:49
Plus spécifiquement pour Word il y a une bonne piste de lecture.
A relire mon script, même s'il relève des fonts présentes dans tout le système (et je pensais qu'il les relèverait toutes d'ailleurs !), rien n'indique qu'elles soient parcourues par Word.
Il faudrait plutôt se concentrer sur les répertoires suivants :
25 sept. 2024 à 16:55
Bonjour,
L'analyse est intéressante.
Le dossier vs renferme au format 8+3 les polices qui sont installées par Office dans Fonts lors de son installation, ce n'est pas le "dossier de travail".
L'application ne renferme que les polices téléchargées depuis le Microsoft Store: chez moi il est non seulement vide mais inexistant.
Les CloudFonts sont en principe l'apanage de Office 365 (peut-être 2021?), je n'ai pas ces articles, et ne sont disponibles que dans Office sauf si on les installe comme une autre police, elles viendront alors dans le dossier Fonts; dans mon cas de figure, je ne devrais rien avoir et j'en ai tout de même deux (Aptos et Mincho) qui ne sont disponibles ni dans Office ni dans Windows.
Le dossier Fonts dans le dossier utilisateur est lui surprenant: il héberge les polices qu'on a téléchargé hors Microsoft (Store et Cloud) sous leur nom de téléchargement alors qu'elles existent quand elles sont installées dans le dossier Fonts de Windows sous leur nom réel.
L'article pointe sur une dernière subtilité (ou plutôt un dernier Bazar): les polices de provenance Store et Cloud sont seulement visibles dans la personnalisation des polices des paramètres, pas dans le dossier Fonts (mais pour moi cela revient au même).
La moralité dans mon cas particulier est que les polices coupables sont forcément dans le dossier Fonts, mais qu'il y règne une telle anarchie que j'ai pu ne pas les voir; je vais certainement les remettre en évidence (et les virer) après un peu de ménage global de ce dossier.