vendredi 7 décembre 2012

Utiliser les fichiers textes.

Nous allons voir comment lire et écrire un fichier sur le disque. Dans l'exemple suivant, je vais créer un fichier texte, écrire quelques choses dedans, et lire son contenu.

 
#Chemin du fichier.
$fichier1 = "C:\Jumbor12.txt"

#Verifie si le fichier existe.
$test1 = Test-Path $fichier1

#Si le fichier n'existe pas, je crée un nouveau fichier.
if ($test1 -ne "True") { New-Item -ItemType file -Path $fichier1 -Force }

#Ajoute une ligne dans le fichier.
Add-Content -Path $fichier1 -Value "Nouvelle ligne !"

#Lit le contenu du fichier, et l'affiche dans la console.
get-content $fichier1 | foreach { write-host $_ }

#Fin.

Cette dernière ligne mérite quelques explications. Je vais la décomposer un peu. "get-content $fichier1" lit le fichier. Si on tape seulement cette partie, la commande va afficher le contenu du fichier dans la console. Le "|" permet de rediriger le résultat vers une autre commande. Ici j'envoie le résultat vers une boucle foreach. La redirection "|" n'envoie pas tout le résultat d'un coup vers la commande suivante, il procède ligne par ligne. Chaque ligne renvoyée est alors contenue dans la variable "$_". La boucle foreach sert à traiter chaque ligne du fichier.

Nous allons voir maintenant un NotePad maison. Dans cet exemple, j'ouvre une fenêtre qui va afficher le contenu d'un fichier dans une TextBox multiligne. A la fermeture de la fenêtre, je transfère le contenu de la TextBox dans le fichier.

 
#Assembly.
[Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

#Chemin du fichier.
$fichier1 = "C:\Jumbor12.txt"

#Ouvre une fenêtre.
$form = New-Object Windows.Forms.Form
$form.text = "Notepad maison."            
$form.Size = New-Object System.Drawing.Size(250,250)

#Création d'une zone texte (TextBox).
$texte1 = New-Object Windows.Forms.TextBox
$texte1.Location = New-Object Drawing.Point 0,0
$texte1.Size = New-Object Drawing.Point 242,216
$texte1.Multiline = $True
$texte1.WordWrap = $False
$texte1.ReadOnly = $False
$texte1.backcolor = "white"
$texte1.ScrollBars = "Both"

#Lecture du fichier
#Verifie si le fichier existe.
$test1 = Test-Path $fichier1

#Si le fichier existe, je lis le fichier, sinon le contenu de la TextBox est vide.
if ($test1 -eq "True")
  {
    $t = ""
    get-content $fichier1 | foreach { $t = $t + $_ + "`r`n" }
    $texte1.Text = $t
  }
else { $texte1.Text = "" }

#Attache le contrôle à la fenêtre.
$form.controls.add($texte1)

#Affiche le tout.
$form.ShowDialog()

#Sauvegarder TextBox.
#Verifier si le fichier existe.
$test1 = Test-Path $fichier1

#Si le fichier existe, je le supprime.
if ($test1 -eq "True") { Remove-Item $fichier1 -ErrorAction SilentlyContinue }
New-Item -ItemType file -Path $fichier1 -Force

#Création d'un nouveau fichier avec écriture du contenu de la TextBox.
foreach ($l in $texte1.Text) { Add-Content -Path $fichier1 -Value $l }

#Fin.

Voici une petit exemple supplémentaire pour les besoins tout simple qui nécessite d'ouvrir un fichier, de faire un petit traitement et de la mettre à jour le fichier sans se compliquer la vie.

 
$fichier1 = "C:\Jumbor12.txt"
$texte1 = Get-Content $fichier1 | foreach {
                                            #Affiche la ligne courante.
                                            Write-Host $_
                                            #Ajoute un commentaire.
                                            $out = $_ + "OK"
                                            #Retourne la ligne modifiée.
                                            $out
                                          }
Set-Content -Path $fichier1 -Value $texte1