mercredi 30 novembre 2011

Enumérer les propriétés den PowerShell

Il y a peu, j'ai eu besoin d'obtenir l'énumération des propriétés d'un objet.
En mode interactif, il suffit de faire:
$myObject | Get-Member

Seulement voila, j'en avait besoin en runtime parce que je voulais énumérer les champs d'un DataRow.
Maintenant que je n'en ai plus besoin, j'ai trouvé une magnifique référence sur le net.

Voici l'article "Create A PowerShell Hash Table From A PowerShell Object" qui extrait les propriétés d'un objet et ses valeurs.
Une perle :-)

$myobject | Get-Member -MemberType Properties |
    ForEach {$hash=@{}} {
        $hash.($_.Name) = $myobject.($_.Name)
    } {$hash} 

A noter que l'opération inverse se code comme ceci:
$peeps = @{
  'Lead'='asmith';
  'Enterprise'='bjones';
  'Edge'='chumperdink';
  'Backend'='dwilford';
  'SED'='fhanns'
}            

$obj = New-Object -Type PSObject -Property $peeps

Source:

lundi 21 novembre 2011

Powershell - Interaction Word Excel Access SqlServer

Voici un chouette article de Code Project d'introduction qui indique comment manipuler des sources telles que Excel, Word, ou encore Access ou SqlServeur.

A Quick Guideline for Microsoft Windows PowerShell: Part 3

jeudi 17 novembre 2011

Accéder à une base de donnée DBase / FoxPro (dbf)

Introduction
Les bases de donnée DBBase sont principalement constituées de fichiers dbf stocké dans un répertoire du disque dur.
Ayant connu ses jours de gloires, aujourd'hui DBase n'est plus que l'ombre de lui même.

Mais qui donc pourrait bien avoir besoin de travailler avec une base de donnée de l'age de pierre?

Et bien, de nombreux logiciels utilisent encore des fichiers DBase.
C'est entre autre le cas dans ma société où l'on utilise encore un vieux logiciel Clipper pour gérer le stock et les commandes.
Ce logiciel DOS, certes vieux, est de loin nettement plus efficace que ses équivalents Windows car il fonctionne entièrement au clavier et est totalement prévisible.

Donc dans l'attente d'une solution satisfaisante, nous maintenons ce logiciel en production.
Mais pour valoriser ces données, il est venu le temps d'accéder à cette base de donnée avec autre chose que Clipper.
C'est la raison même de l'existence de cet article :-)

xBaseView
Avant d'extraire les informations du coeur de la base de données, j'ai besoin d'en connaître la structure pour me familiariser avec elle.
Pour me faciliter la vie, je suis parti à la recherche de soft sur le net.

Si je n'ai pas trouvé d'alternative gratuite, j'ai trouvé xBaseView disponible en version d'essai.
Et dans un premier temps, je trouve ce logiciel suffisamment efficace pour faire mes premières explorations.
Source: xBaseView.com

Il semble même disposer d'une section "SQL" pour permettre de faire des jointures en SQL.
Bien que je ne l'ai pas encore essayé, il semble aussi possible de faire des exportations Excel.

Pour plus d'information:
Accéder à la base de donnée
En vérifiant les pilotes utilisés par xBaseView (cfr menu Aide | Pilotes DB), j'ai remarqué que xBaseView utilisait le pilote ODBC odbcj32.dll made in Microsoft.
De là à penser qu'il est possible d'y accéder en PowerShell, il n'y a qu'un pas.
Je vais donc m'y atteler... mais ce sera l'objet de l'article "Accéder à une base de donnée DBase / FoxPro (dbf) en PowerShell".

Accéder à une base de donnée DBase / FoxPro (dbf) en PowerShell


La connection string
Avant tout, il faut une "Connection String" permettant de mentionner la DB et le Driver à utiliser.
Une visite sur www.connectionstrings.com est bien utile pour nous aider dans cette tâche.
J'ai retenu l'option suivante (voir cette page)
Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=c:\mydbpath;
Après quelques péripéties, j'en suis arrivé à utilisé un OleDB provider avec la ConnectionString suivante:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\temp\stock;Extended Properties= dBASE IV

PowerShell et Accès DB
Je vous propose les lectures suivantes pour vous familiariser avec l'écriture de code d'accès DB en PowerShell.
Installation des drivers ODBC ou Equivalent
Par defaut, mon Win7 64 bit ne dispose que des drivers ODBC pour Sql Serveur.
Voir  l'outil de configuration "Administration des sources de données ODBC"

J'ai donc besoin d'installer un driver ODBC pour attaquer DBase ou tout équivalent.
Après de longue recherche et m'être éclaté plusieurs fois la tête au mur, j'ai opté pour l'installation du Microsoft Jet Engine disponible sur le net.
Selon certaines sources, l'ACE Engine de Microsoft fonctionnerait très bien aussi.
Dans les faits, je sais qu'il est possible d'attaquer un fichier DBase avec un OleProvider Microsoft.Jet.OLEDB.4.0

Windows 64 bits, PowerShell et OleDB ou ODBC
Nous utilisons Windows Seven 64 bits et Powershell pour attaquer la DB.
Tous mes premiers essais terminait inlassablement par le message " Le fournisseur 'Microsoft.Access.OLEDB.10.0' n'est pas inscrit sur l'ordinateur local " (Arghhh!!! pffff!)
C'est a se taper la tête au mur! Si je regarde dans la base de registre, mon provider OLEDB est bien là!

Mais pourquoi ai-je donc ce message d'erreur?
Et bien mon problème réside dans le fait que j'utilise un OS 64 Bits!
D'un côté, Microsoft à bien produit un provider 64 bits pour SqlServeur mais pas de version 64 bits de Jet Engine (moteur DB d'access).
Office 2010 est toujours un logiciel 32 bit, cela inclus aussi Access et le Jet Engine (et Dieu seul sait quoi d'autre).

D'un autre côté, mon PowerShell fonctionne en 64 bits... et accède uniquement les OleDB Provider 64 bits.
En gros, je suis limité à SqlServeur!

La solution: Utiliser PowerShell 32 bits
Heureusement, ce n'est pas sans solution, en effet, il suffit de se rabattre sur une version 32 bits de PowerShell pour pouvoir accéder librement au OleDB Provider 32 comme Jet Engine.
Et ça marche :-)
Gregory Stike aborde assez clairement ce sujet dans son article "How to Tell if PowerShell is 32-bit or 64-bit"
Pour résumer, il faut:
  • Démarrer un "command prompt" en mode Administrateur
  • Exécuter
    C:\Users\Stock>C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe
  • Ne pas oublier de modifier l'exécution policy dans PowerShell si vous voulez exécuter un script
    Set-ExecutionPolicy Unrestricted
Lister les Provider OleDB
L'article "List of OLEDB providers on local or remote computer" présente un petit bout de code qui extrait la liste des OleDB provider enregistré dans la base de registre.
Si j'ai un jour du temps, j'en ferai un script PowerShell.
Un exemple concret
  # On 64 Bits OS, this must be executed with the PowerShell 32 bits
  #   C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe
  
  # DB est stockée dans le répertoire c:\temp\Stock
  $ConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\temp\stock;Extended Properties= dBASE IV"
  $conn = new-object System.Data.OleDb.OleDbConnection($ConnString)

  $conn.open()

  $cmd = new-object System.Data.OleDb.OleDbCommand("select * from FILE0030",$Conn)
  $da  = new-object System.Data.OleDb.OleDbDataAdapter($cmd)
  $dt  = new-object System.Data.DataTable

  $da.fill($dt)
    Write-Host "Contenu du DataTable"
  $dt 

  $conn.close() 


mardi 15 novembre 2011

Information Windows en Powershell

Voici un petit script qui en dit long sur la version de Windows exécutant le script PowerShell.
Selon les cas, cela peut-être vraiment très intéressant.

   $regset = get-item "HKLM:Software/Microsoft/Windows NT/CurrentVersion"
   foreach( $i in $regset.GetValueNames() ){ 
      Write-Host $i " = " $regset.GetValue($i) 
   }
Ce qui produit le résultat suivant (dont j'ai masqué une partie des valeurs):
CurrentVersion  =  6.1
CurrentBuild  =  7600
SoftwareType  =  System
CurrentType  =  Multiprocessor Free
InstallDate  =  1294140650
RegisteredOrganization  =  
RegisteredOwner  =  UTILISATEUR
SystemRoot  =  C:\Windows
InstallationType  =  Client
EditionID  =  Professional
ProductName  =  Windows 7 Professional
ProductId  =  00371-OEM-8992671-00007
DigitalProductId  =  164 0 0 0 3 0 0 0 48 48 51 55 49 45 79 69 77 45 56 57 57 50 54 55 49 45 48 48 ...
0 0 0 0 0 0 0 0 0 0 138 54 94 179
DigitalProductId4  =  248 4 0 0 4 0 0 0 48 0 48 0 51 0 55 0 49 0 45 0 48 0 48 0 49 0 55 0 56 0 45 0 57 0 50 0 54 0 45 0 55 0 48 0 48 0 48 0 48 0 55 0 45 0 48 0 50 0 45 0 49 0 48 0 51 0 51 0 45 0 55 0 ...
0 0 0 79 0 69 0 77 0 58 0 83 0 76 0 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
CurrentBuildNumber  =  7600
BuildLab  =  7600.win7_ldr.110622-1505
BuildLabEx  =  7600.20994.amd64fre.win7_ldr.110622-1505
BuildGUID  =  0d6bd58e-3df7-4453-87c2-093e51a17572
CSDBuildNumber  =  1
PathName  =  C:\Windows

lundi 14 novembre 2011

TkInter: Interface graphique pour Python

Python est un langage vraiment puissant.
Si je ne l'utilise plus pour le moment, je constate à merveille qu'il reste attrayant et que la lecture de quelques lignes de code éveille toujours autant mon intérêt.

Comme précisé dans l'article "PrimalForms: Interfaces graphiques en PowerShell", le principal désavantage des langages de scripting, c'est qu'ils rebutent justement l'utilisateur Lambda par une lacune importante.
Cette lacune, c'est le manque d'interface graphique pour interagir avec l'utilisateur.

TkInter - Interface Graphique pour Python
Au détour d'une lecture de Full-Circle Magazine, je suis tombé sur TkInter à comprendre comme "Tk Interface".
TkInter est presqu'un langage en lui même. Il permet de décrire une interface graphique à l'aide de script en Python.
TkInter est très bien adapté à la programmation Python et la librairie pensée de façon à requérir un minimum de connaissances spécifiques.
Cerise sur la gâteau, en ce qui concerne mon système Ubuntu, TkInter est déjà installé avec l'environnement Python :-)

Mes deux premiers essais étaient littéralement bluffant et brillant par leur efficacité.
Certes, rien à voir avec un développement C# Forms, mais déjà tellement efficace. 
Si vous êtes intéressé, je vous propose de prendre connaissance des deux articles en Français concernant TkInter dans:
  • Full Circle Mag, No 51, Développement Ubuntu (pdf)
  • Full Circle Mag, No 52, Zone Minder CCTV - partie 1 (pdf)
Ressources:



dimanche 13 novembre 2011

Rotation des images dans Open-Office.org

Les habitués de Word seront certainement très déstabilisé.
Contrairement à ce que l'on pourrait penser, il ne suffit d'insérer l'image dans le document et d'afficher les propriété de cette dernière et de demander une rotation.
Que né-ni, ce n'est pas comme cela que ça fonctionne.
Et si vous ne savez pas comment faire, cela peut vous prendre un certain temps.

Merci aux forums parce qu'il y a moyen de chercher pendant des heures.
Voici donc la marche à suivre car si vous copiez ou insérez une image dans OpenOffice Writer, vous ne pourrez pas la pivoter.

  • Il faut la copier ou l'insérer dans OpenOffice Draw
  • Puis faire une rotation à l'aide du volet "Rotation" de la fenêtre "Position et Taille".
    La fenêtre "position et taille" peut être affichée à l'aide du menu contextuel "Position et taille..." disponible sur l'image.
  • Puis copier / coller l'image de OpenOffice Draw dans OpenOffice Writer
Aussi très intéressant à savoir:
Si l'image est ouverte dans "OpenOffice Draw" et qu'ensuite elle est copié/collé immédiatement dans "OpenOffice Writer"
Alors il est possible de modifier l'orientation dans "OpenOffice Writer" à l'aide du menu contextuel "Position et Taille..." (Onglet "Orientation").


Franchement, il faut le savoir!

samedi 12 novembre 2011

PrimalForms: Interfaces graphiques en PowerShell

Les langages de scripting rendent de nombreux services dans le monde Unix depuis des lustres.
Dans un monde dominé par Windows, il était fort regrettable de ne pas disposer d'un outil puissant.
Heureusement, Microsoft à fini par combler cette lacune avec PowerShell... et il faut bien avouer que même arrivé tardivement PowerShell est une réussite aussi aboutie de Bash ou Python.

L'utilisateur Lamba et les scripts
PowerShell c'est beau mais c'est du scripting.
Si cela parle aux administrateurs et développeurs, l'utilisateur final n'y entend absolument rien.
Une interface graphique pour contrôler un script, c'est quand même mieux pour le commun des mortels.
Mais comment faire?

Une solution pour PowerShell
Python dispose de TkInter et quelques essais révèle déjà sa toute puissance.
Il est simple et efficace, visiblement bien adapté aux langages de scripting.
Malheureusement, TkInter ne semble pas exister pour PowerShell (sniff).
Je suis donc parti à la recherche d'un équivalent sur le net et j'ai trouvé la liste d'article suivant:
L'un des articles fait référence à PrimalForms Community Edition, un outil disponible gratuitement (à confirmer), permettant de faire des interfaces graphiques pour PowerShell.

NB:
Cet autre article jette aussi quelques mots sur PrimalForms dans un article.
Selon l'auteur, le résultat serait assez "bluffant".

 

lundi 7 novembre 2011

PowerShell - Excel - Combien de Rows dans la feuille

J'utilise beaucoup PowerShell pour automatiser des scripts de transformation de données Excel.
Il m'arrive régulièrement de ne pas connaître exactement le contenu des feuilles.
Ainsi, j'ai besoin de savoir combien de Rows et Columns sont utilisés dans une feuille Excel.

C'est une question à laquelle il n'est pas facile d'obtenir une réponse.
Maintenant que j'ai enfin trouvé la réponse, je la publie :-)
param([string]$file = $(throw "file parameter required.") )

# Ensure existence of the file
trap [Exception] {
      write-error $("TRAPPED: " + $_.Exception.GetType().FullName);
      write-error $("TRAPPED: " + $_.Exception.Message); 
   write-host "Missing source file: " $file -ForegroundColor Red
   Exit
}

$fullname = resolve-path $file
if( -not( Test-Path $fullname ) ){
 write-host "Missing source file: " $fullname -ForegroundColor Red
 Exit 
}

# Open the Excel file
Write-Host "Ouverture du fichier" -BackgroundColor Yellow
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$excel.Workbooks.Open( $fullname ) 


Write-Host "Extraction des données..." -BackgroundColor Yellow

$sheet = $excel.Sheets.Item(1)
Write-Host $sheet.UsedRange.Rows.count 
# Affiche "4147"
Write-Host $sheet.UsedRange.Columns.count
#Affiche "7" 

mardi 1 novembre 2011

DnsStuff - Comment obtenir les informations DNS facilement

Qui aura passé par DNS.BE saura qu'il est contraignant d'obtenir des informations de type DNS.

A côté de cela, il existe le site www.dnsstuff.com qui permet de faire une recherche WhoIs, un Trace Route ou de retrouver des informations à partir de l'adresse IP en toute simplicité depuis une interface Web.

Franchement, pourquoi se casser la tête ?