Lorsqu'un fichier est crée, certains caractères ne peuvent être utilisés, parce qu'ils représentent quelque chose de réservé pour le système d'exploitation. Nous en avons facilement exemple en essayant de mettre un caractère interdit lorsque nous créons un fichier.
Et bien évidemment l'identique se présente lorsque nous créons un fichier via un script.
Le problème est identique. Autant pour un fichier crée manuellement, nous pouvons savoir assez facilement qu'un problème se présente, autant lors de l'utilisation via un script cela devient immédiatement plus compliqué. Pour autant, la liste des caractères interdits doit être enregistrée quelque part puisque Windows est capable de détecter et afficher ces caractères. Comment faire?
Avec un peu de recherche et avec l'aide d'Intellisense, j'ai pu facilement trouver où étaient stockés ces caractères interdits.
Ils sont situés dans la méthode d'une classe bien spécifique, en rapport avec le nommage des fichiers :
[System.IO.Path]::GetInvalidFileNameChars()
En enregistrant le retour de cette méthode dans une variable, nous avons un tableau de caractères avec lequel nous pouvons créer une boucle et modifier chaque caractère interdit trouvé dans la chaîne de caractères que nous voulons changer.
Démonstration
#Création d'une variable contenant tout un tas de caractères interdits
$fichieravant = "n:i<<>c*\o>||as/\/l\a//n:/g.:\b?**l\:\:\:o|?|g/\s/?/p**o**t**.**c??o??m"
#on copie cette valeur dans une autre variable afin d'avoir la comparaison avant / après
$fichierapres = $fichieravant
#on enregistre la liste des caractères invalides
$charsinvalides = [System.IO.Path]::GetInvalidFileNameChars()
#on boucle afin d'avoir chaque caractère
foreach ($char in $charsinvalides)
{
#On modifie la chaine de caractère pour remplacer le caractère interdit par "" (c'est à dire, rien)
$fichierapres = $fichierapres.Replace("$char","")
}
Write-Host "Avant modification : $fichieravant"
Write-Host "Après modification : $fichierapres"
Et voila le résultat!