demande de rappel immédiat

Powershell : Comment interagir avec les fichiers OEM.

Posted by Jean-Paul Blanc Tuesday, March 02, 2010 4:43:00 PM
Rate this Content 0 Votes

 

 

 

Constatations


Je vais commencer pas une constatation. J’utilise l’interpréteur de commande CMD.EXE pour exécuter la commande suivante : ping 192.168.1.96 > PingDansCMD.txt. J’utilise ensuite l’interpréteur de commande Powershell pour exécuter une commande analogue : ping 192.168.1.96 > PingDansPowershell.txt. Je compare la taille des deux fichiers et tombe sur le résultat suivant :
PingDansCMD.txt  506 octets
PingDansPowershell.txt  1 036 octets

La taille varie du simple au double, mais pas exactement. Voici le rendu dans un éditeur héxadécimal :

Le fichier produit sous Powershell est en Unicode la signature FF FE du début du fichier indique la primauté des octets de poids faible (little-endian, page de codes 1200). On remarque par ailleurs que les caractères 0D (carriage return) seuls ont étés remplacés par 0D 0A (carriage return Line feed). Bref cela me conduit à deux conclusions.

conclusions.

 

  1. Dans Powershell il y a une interprétation, du type présentation des données, au moment de la redirection du flux de sortie. Pour ce qui suit je garde juste que les données sont traduites en Unicode. Par contre dans l’absolue, je mets en garde les utilisateurs d’interpréteur de commandes de type UNIX qui ne sont pas habitués à une telle transformation.
     
  2. Dans Powershell on ne traite que de l’Unicode. Cette constatation est une évidence quand on sait que Powersell exploite le Framework .NET dans lequel les chaînes sont Unicode.

 

Conséquences.

 

si je veux traiter des fichiers OEM, je dois les convertir dans le format de chaines internes, les traiter  et potentiellement les recoder au format OEM en sortie.
Voici un petit exemple de programme qui s’appuie sur la fonction Get-OemContent pour lire un fichier OEM, qui le manipule en Unicode puis le ressort en OEM.
 

# Fonction de lecture du contenu d'un fichier OEM
Function Get-OemContent ([string]$OemFile)
{
    # Utilisation de la classe "Encoding" pour effectuer la transformation de tableaux de caractères
    $cultureInfoOEM = [system.Globalization.CultureInfo]::CurrentCulture.TextInfo.OEMCodePage
    $encodingOEM = [System.text.Encoding]::GetEncoding($cultureInfoOEM)
 
    # Ouverture du fichier
    $FileStream = New-Object System.IO.FileStream ($OemFile, [System.IO.FileMode]::Open)
    $StreamReader = New-Object System.IO.StreamReader ($FileStream, $encodingOEM)
    [String[]]$tabChaineAnsi = @()
    while (! $StreamReader.EndOfStream)
    {
        $chaineAnsi = $StreamReader.ReadLine();
        $tabChaineAnsi += $chaineAnsi
    }
    $StreamReader.Close()
    $FileStream.Close();
    return $tabChaineAnsi
}

clear
$tabChaineAnsi = Get-OemContent c:\silogix\pingDansCMD.txt
# Traitement du tableau de chaines résultant
foreach ($chaine in $tabChaineAnsi)
{
    if ($chaine.Length -ne 0)
    {
        $adresseInverse = $chaine -replace '([0-9]+).([0-9]+).([0-9]+).([0-9]+)','$4, $3, $2, $1'
        $adresseInverse | Out-File c:\silogix\pingDansCMD1.txt -Encoding OEM -Append
    }
}
Comments are closed on this post.