Jan 082019
 

J’ai créé un service similaire à dweet.io
Je m’en sers pour logguer des infos (capteur de temperature, uptime,…)

J’ai des Raspberry, CHIP, Omega, Arduino (esp8266) qui ont besoin de remonter facilement ce genre d’infos. Comment?

Comme ceci dans un « crontab -e « :

* * * * * wget --user-agent=arduino "http://www.snakenet.be/dweet/?key=ONION&freemem=`grep "MemFree" /proc/meminfo | awk '{print $2}'`&uptime=`cat /proc/uptime |awk '{print $2}'`" -O /dev/null &

Faut aussi penser à activer crontab (sous Omega)

/etc/init.d/cron start
/etc/init.d/cron enable

et on visionne le résultat avec cette page :

Exemple d’analyse de la vitesse d’upload de ma connexion internet :

#!/bin/bash
upload=`./speedtest-cli --no-pre-allocate --no-download --simple | grep "Upload" | cut -f 2 -d ':' | cut -d ' ' -f 2`
wget --user-agent=arduino "http://www.snakenet.be/dweet/?key=VOO&upload=$upload" -O /dev/null

 

Oct 172016
 

Amusant. Si vous faites « enregistrer sous » et choisissez le format « CSV » et que vous avez des caractères bizarres ( Comme é,è,&,..) Excel les détruira lors de l’enregistrement (pas sympa)

Si vous faites « fichier > exporter » et choisissez le format CSV, ca va mieux! mais c’est pas encore ça.. (les champs ne sont pas entre guillemets et on ne peux pas choisir le caractère de séparation…

Voici donc un script PowerShell qui fait le boulot…

Et pour que ce soit GENIAL, faites un raccourci windows avec cette commande:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe  -ExecutionPolicy Bypass   -file  « H:\Scripts\XLS to CSV.ps1 »
(pensez à changer le chemin du script)
Ainsi, il vous suffira de faire un drag’n drop de votre fichier excel sur ce raccourci et HOP! converti !
(on pourait aussi envisager de le mettre dans « send to » mais, ca, je vous laisse faire)

param([string]$xlFile=’nothing’)
$debugMode=$false
$ErrorActionPreference=’Stop’
if ($debugMode) { $xlFile= »H:\Book1.xlsx » }
$csvFile=$xlfile.Replace(‘.xlsx’,’.csv’).replace(‘.xls’,’.csv’)
## Checking…
if ( $xlFile -eq ‘nothing’ ) { Write-Host « No Excel file given. aborting… »                                                     -foregroundcolor red ;$tmp=Read-Host « Press ENTER key to exit »;exit }
if ( test-path($xlFile -eq $false)  ) { Write-Host « Specified Excel file does not exist. »                                        -foregroundcolor red ;$tmp=Read-Host « Press ENTER key to exit »;exit }
if ( test-path($csvFile)   ) { Write-Host « Old converted CSV file exist. Please, delete it before trying to convert it again. »   -foregroundcolor red ;$tmp=Read-Host « Press ENTER key to exit »;exit }
# http://stackoverflow.com/questions/687891/exception-automating-excel-2007-with-powershell-when-calling-workbooks-add
& {
[threading.thread]::CurrentThread.CurrentCulture = ‘en-US’
$xl = New-Object -COM « Excel.Application »
$xl.Visible = $debugMode
Write-Host « Opening source file » -foregroundcolor green
$wb = $xl.Workbooks.Open($xlFile)
$ws = $wb.Sheets.Item(1)
  $i=1
while( $ws.Cells.Item(1, $i).value2 -ne $null ) { if ( $debugMode) {Write-host « Debug 1 : counting column $i »}; $i++ }
$maxColonne=$i-1
  $i=1
while( $ws.Cells.Item($i, 1).value2 -ne $null ) { if ( $debugMode) {Write-host « Debug 1 : counting row $i »}; $i++ }
$maxLigne=$i
  Write-Host « There will be $maxColonne columns and $MaxLigne lines to convert. » -foregroundcolor green
$object=@()
$ligne=2   # ligne 1 = titre
$colonne=1
  while( $ws.Cells.Item($ligne,1).value2 -ne $null ) {
$line=New-Object PSObject
$colonne=1
while( $colonne -le $maxColonne) {
$cell=$ws.Cells.Item($ligne,$colonne).value2
if ($cell -eq $null) { $cell = «  » }
Add-Member -InputObject $line -MemberType NoteProperty -Name $ws.Cells.Item(1, $colonne).value2 -Value $cell
if ( $debugMode) {Write-host « debug2  » + $ws.Cells.Item($ligne,$colonne).value2 }
$colonne++
}
$ligne++
$object += $line
write-host -NoNewline « `r                                              `r Progres : $ligne/$maxLigne »
}
  $wb.Close() | out-null
$xl.Quit() | out-null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($xl) | out-null
  Write-Host « `r`n$ligne rows where converted. » -foregroundcolor green
Write-Host « Saving datas to $csvFile. Please, wait… » -foregroundcolor cyan
$object | Export-Csv $csvFile -NoTypeInformation -Delimiter ‘;’ -Encoding UTF8
Write-Host « Save completed. » -foregroundcolor green
sleep 3
}
Tadaaaaa…
Nov 142015
 

Aujourd’hui, j’ai fait une connerie… J’ai droppé tout le contenu de ma base de donnée MySQL qui hébergeait ce site.

Bon, pas grave, j’ai des backups (mis en place il y a 3 ans) et ils sont régulièrement recréés, tout va bien.

Et bien non… Le script que j’utilise (choppé sur le net) ne m’encapsule pas les champs de type datetime entre quotes. Résultat: impossible de charger le dump.

J’ai heureusement un petit éditeur de texte super intelligent ContextEditor pour ne pas le citer qui me permet de faire de belles macro. 2 heures plus tard, j’ai enfin un dump qui s’importe. Ouf! plus de peur que de mal!

J’en ai profité pour corriger le script de backup, et SURTOUT, je l’ai testé (en détruisant à nouveau la DB, mais avec un backup de phpmyadmin et avec mon backup précédent).

Résultat : ça fonctionne. Et donc, j’en profite pour vous le taper ci-dessous (bande de veinards).

<?php
$MYSQL_DB='MAdb';
$MYSQL_USER='MONuser';
$MYSQL_PWD='MONpassword';
$MYSQL_SERVER='MonServeurLocal';
$MYSQL_DUMP='./mysql_'.date('l').'.dump';
// Exporting MYSQL
$infos=dumpMySQL($MYSQL_SERVER,$MYSQL_USER,$MYSQL_PWD,$MYSQL_DB);
$fichierDump = fopen($MYSQL_DUMP, "wb");
fwrite($fichierDump, $infos[0]);
fwrite($fichierDump, $infos[1]);
fwrite($fichierDump, $infos[2]);
fclose($fichierDump);

function dumpMySQL($serveur, $login, $password, $base)
{
    $connexion = mysql_connect($serveur, $login, $password);
    mysql_select_db($base, $connexion);
    $entete = "-- ----------------------\r\n";
    $entete .= "-- dump de la base ".$base." au ".date("d-M-Y")."\r\n";
    $entete .= "-- ----------------------\r\n\r\n\r\n";
    $creations = "";
    $insertions = "\r\n\r\n";
    $listeTables = mysql_query("show tables", $connexion);
    while($table = mysql_fetch_array($listeTables))
    {
        // si l'utilisateur a demandé la structure ou la totale
        {
            $creations .= "-- -----------------------------\r\n";
            $creations .= "-- creation de la table ".$table[0]."\r\n";
            $creations .= "-- -----------------------------\r\n";
            $listeCreationsTables = mysql_query("show create table ".$table[0], $connexion);
            while($creationTable = mysql_fetch_array($listeCreationsTables)){
              $creations .= $creationTable[1].";\r\n";
            }
        }
        // si l'utilisateur a demandé les données ou la totale
        {
            $donnees = mysql_query("SELECT * FROM ".$table[0]);
            $insertions .= "-- -----------------------------\r\n";
            $insertions .= "-- insertions dans la table ".$table[0]."\r\n";
            $insertions .= "-- -----------------------------\r\n";
            while($nuplet = mysql_fetch_array($donnees))
            {
                $insertions .= "INSERT INTO ".$table[0]." VALUES(";
                for($i=0; $i < mysql_num_fields($donnees); $i++)
                {
                  $FieldType=mysql_field_type($donnees, $i);
                  if($i != 0)
                     $insertions .=  ", ";
                  if($FieldType == "string" || $FieldType == "blob" || $FieldType == 'datetime')
                     $insertions .=  "'";
                  $insertions .= addslashes($nuplet[$i]);
                  if($FieldType == "string" || $FieldType == "blob" || $FieldType == 'datetime')
                    $insertions .=  "'";
                }
                $insertions .=  ");\r\n";
            }
            $insertions .= "\r\n";
        }
    }
    mysql_close($connexion);
    echo "Sauvegarde réalisée avec succès !!";
    return(array($entete,$creations,$insertions));
}
?>
Sep 162015
 

Si vous avez une BBox qui d?conne comme la mienne, vous ne savez plus où se trouve quelle VM/PC/T?l?phone/bidule.. d’un point de vue IP. Ce petit script fait un inventaire assez sympa. (attention, gourmand en ressources )

Adaptez les champs en gras selon vos besoins 🙂

$MASK='10.254.0.'
$myJobs=for( $i=1;$i -le 254 ; $i++){ 
  $ip=''+$MASK+$i
  Start-Job? -ArgumentList $ip -ScriptBlock { param ($ip)
    if ( test-connection $ip -Quiet -Count 2 ) {
      try    { $hostname=[System.Net.Dns]::gethostentry($ip).Hostname }
      catch { $hostname='Unknown' }

      Finally{ New-Object PSObject -Property @{ IP = $IP ; HostName = $Hostname } }
    }
  }
}
$myJobs | wait-job | out-null
$myJobs | foreach { $_ | receive-job -keep | select IP, Hostname } | tee -variable inventaire | ft -autosize
Sep 072015
 

Bonjour,

Si, comme moi, vous ne savez pas « vraiment » sur quel switch, ni quel port se trouve connecté la vmnic de votre ESX ET que votre switch ne supporte pas CDP, mais LLDP, voici un script maison qui va vous donner l’info.

Mon script lance une capture d’une trame spécifique émise par le switch sur chaque porte afin de faire un inventaire.
L’info est sauvée dans un datastore connu de tous les ESXs (plus facile pour récupérer l’info)

Prérequis :

  • un accès ROOT sur chaque ESX
  • Une connexion via SSH possible sur la console
  • Un datastore commun à tous les ESXs

La création du tableau de correspondance ESX <> mot de passe ROOT

$ESXs =@{'ESX01' ='abc123'}
$ESXs+=@{'ESX02' ='def456'}

Le script :

get-datacenter "MON DataCenter" | get-vmhost | foreach {
$esx=$_.name
$password=$ESXs.Get_Item($_.name)
$_ | Get-VirtualSwitch | select -expandproperty nic| foreach {
$vmnic=$_

$file= »C:\temp\$esx-$vmnic.sh »
‘ps | grep « pkt » | awk  »{ print $1 } » | kill’ | out-file $file -Encoding ascii
« pktcap-uw –uplink $vmnic –ethtype 0x88cc -c 1 -o /tmp/$vmnic  » | out-file $file -append -Encoding ascii
‘FEX=`hexdump -e « 500 \ »%_p\ » \ »\\n\ » » /tmp/’+$vmnic+’ | cut -b 67-77`’ | out-file $file -append -Encoding ascii
‘echo `hostname`,’+$vmnic+’,$FEX >> /vmfs/volumes/MonDatastore/vmnicInventory.csv’ | out-file $file -append -Encoding ascii
« putty.exe $esx -l root -pw $password -m C:\temp\$esx-$vmnic.sh »
putty.exe $esx -l root -pw $password -m C:\temp\$esx-$vmnic.sh | out-null
}
}

Si tout se passe bien, vous vous retrouvez avec un super fichier texte avec toutes les infos.

NB : J’affiche dans la console la ligne de commande que j’execute, car il m’est déjà arrivé de voir « putty » planter en pleine collecte. Plutôt que de tout relancer, je ne lance que la commande qui a planté.
NB2 : Je ne lance pas toutes les collectes en même temps, car il peux arriver que 2 commandes veuillent écrire en même temps et alors, ca plante. C’est plus lent, mais plus sur.

Août 282015
 

ca peux sembler être le titre d’un roman, mais dans la catégorie cauchemar alors ! Je m’explique :

Aujourd’hui, j’ai écrit un super script qui fait plein de choses intéressantes, et histoire de faire ça correctement, je mets quelques programmes exécutable supplémentaires dans le répertoire C:\Windows\system32.

Jusque-là, rien de bien méchant, sauf que mon script qui est lancé par un service supplémentaire, refuse d’exécuter les programmes que j’ai ajouté. Fichier introuvable qu’il me dit.

Introuvable, introuvable? Il lui faut des lunettes, oui!

Je lance à la main, ça fonctionne. Je le lance à partir du service, ça ne fonctionne plus.

Là, on se dit qu’on commence à perdre la tête ou que Windows est une belle merde. Et donc on se retrouve a faire des choses aussi stupide que de faire un « dir » des fichiers en question .

Et c’est là que ça se corse, comme dirait Napoléon

Quand mon script liste les fichiers, il ne trouve rien. Quand je liste les fichiers, je les vois…

Je vous passe tous les noms d’oiseaux qui me sont passés par l’esprit…

Et j’en suis arrivé à la conclusion que la seule différence était le service en question, vieux service qui fonctionnait en 32 bits. Je démarre une console PowerShell en 32 bits, et tente de lister les fichiers? Surprise, pas de fichiers présents. Ou plutôt, pas de fichier 32 bits!!!!!

Windows, pour une raison que je n’explique toujours pas, n’affiche pas les programmes 32 bits qui se trouve dans le répertoire C:\Windows\system32.

J’ai donc trouvé 2 solutions:

  • Mettre à jour mon service en 64 bits, j’ai de la chance il est disponible.
  • Déplacer mes exécutables dans un autre endroit (ce qui n’est pas une bonne idée quand ce sont des fichiers standards Microsoft comme « dfsutil »)

Si vous êtes arrivés sur cette page, et que cela solutionne votre problème, merci de me laisser un message en commentaire, afin que je me sente moins seul merci!

En fait, Microsoft est déjà prêt pour les ordinateurs quantiques. En fonction de la manière dont on regarde, le résultat n’est pas le même. Tu existes et tu n’existes pas en même temps.

Juil 162014
 

La m?thode longue consiste ? se connecter sur chaque VM, et a executer ce qui suit :

First thing is to log onto the virtual machine and open up msinfo32 via the run prompt (start > run > msinfo32).
Expand ?Software Environment? and then ?System Drivers?
Within this list you?re looking for vsepflt as shown below:

La m?thode automatis?e :
Pensez ? d?sactiver votre proxy de Internet Explorer (oui, je sais, c’est ?trange, et je n’ai ni le temps, ni l’envie de rentrer dans les d?tails)

$credentials=Get-Credential
$VMStatus=Get-VM | Where-Object { $_.PowerState -eq "PoweredOn" -and $_.Guest.OSFullName -match "WinDows" } | ForEach-Object {
$obj=New-Object PSObject
$obj | add-Member Noteproperty -name Name -value $_.name
#? $obj | add-Member Noteproperty -name vShield -value? (Invoke-VMScript -VM $_.name -ScriptType Bat -ScriptText 'driverquery | find /i "vsepflt"' -GuestCredential $credentials -ErrorAction Continue | Select-Object -ExpandProperty ScriptOutput)
$obj | add-Member Noteproperty -name ToolsVersion -value $_.ToolsVersion
$obj | add-Member Noteproperty -name ToolsVersionStatus -value $_.ToolsVersionStatus
$obj | add-Member Noteproperty -name SnapShotCount -value ($_ | Get-Snapshot | Measure-Object | select -ExpandProperty Count )
$obj | add-Member Noteproperty -name SnapShotInfo -value ($_ | Get-Snapshot | select VM,Created, SizeGB, IsCurrent, Name |Out-String )
$obj
}
$VMStatus | out-gridview

Si vous avez le m?me bug que moi, cad, que le re-enregistrement des adresses IP dans le DNS echoue et que le DNS se retrouve vide : http://support.microsoft.com/default.aspx?scid=kb;EN-US;2520155
Pour mettre a jour de maniere pseudo-automatis?e le parc

$credentials=Get-Credential

Get-VM | Where-Object { $_.PowerState -eq « PoweredOn » -and $_.Guest.OSFullName -match « WinDows » -and ($_ | get-snapshot | Measure-Object | select -ExpandProperty Count ) -eq 0 } | foreach {
Get-VM -name svMGTTST01 | foreach {
# ping to check if VM is pinguable
if (Test-Connection $_.name -ErrorAction SilentlyContinue ) { write-host « Ping to $_ : OK » -foregroundcolor green } else { write-host « Ping to $_ : Failed » -foregroundcolor red }
# Take snapshot
New-Snapshot -vm $_.name -Name « Avant VMWare Tools et vShield » -Description « VM avant execution du script automatique » -Memory:$true -Quiesce:$true -Confirm:$false
# Update tools
$_ | Get-View | foreach { $_.Guest.ToolsVersion }
$_ | Mount-Tools
# Copy BAT file
$DestinationFIle= »\\ »+(($_|get-view).Guest.HostName)+ »\c$\UpdateVMwareToolsManually.cmd »
Copy-Item -Path ‘C:\Users\Moi\Desktop\Scripts\VMwareTOols\UpdateVMwareToolsManually.cmd’ -Destination $DestinationFile
Invoke-VMScript -VM $_.name -ScriptType Bat -ScriptText ‘C:\UpdateVMwareToolsManually.cmd’ -GuestCredential $credentials | Select-Object ScriptOutput
Remove-Item $DestinationFile

# unmount
$_ | Wait-Tools

if ( (get-vm svMGTTST01 | Get-CDDrive ).isoPath.Equals(« [] /usr/lib/vmware/isoimages/windows.iso ») -eq $true ) { write-host « CD still mounted. Problem detected » -foregroundcolor red }

# Not necessary. Correct update unmount CDROM.
# $_ | Dismount-Tools

$_ | Get-View | foreach { $_.Guest.ToolsVersion }

# ping to check if VM is still pinguable
if (Test-Connection $_.name -ErrorAction SilentlyContinue ) { write-host « Ping to $_ : OK » -foregroundcolor green } else { write-host « Ping to $_ : Failed » -foregroundcolor red }

# delete snapshot
$_ | Get-Snapshot -Name « Avant VMWare Tools et vShield » | Remove-Snapshot -Confirm:$true
}

Et le script ? envoyer sur chaque VM:

SETLOCAL ENABLEDELAYEDEXPANSION

REM Usage : perform VMWareTools Assisted update and DNS registration
REM http://support.microsoft.com/default.aspx?scid=kb;EN-US;2520155
(
date /t
time /t

set DriveLetter=unknown
for %%a in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ) do? ( if exist %%a:\VMwareToolsUpgrader.exe if exist %%a:\certified.txt set DriveLetter=%%a)
echo DriveLetter : !DriveLetter!

REM check current version of vShield
driverquery | find /i « vsepflt »

!DriveLetter!:\Setup.exe /S /v « /qn REBOOT=R ADDLOCAL=ALL REMOVE=Hgfs »
ipconfig /registerdns

REM check new version of vShield
driverquery | find /i « vsepflt »

date /t
time /t
) >> C:\UpdateVMwareToolsManually.log 2>&1

Fév 282014
 

Fonction ? garder dans un coin :

Function Get-RDPSession {
    [cmdletbinding(DefaultParameterSetName = 'session',ConfirmImpact = 'low')]
    Param(
        [Parameter(Mandatory = $True,Position = 0,ValueFromPipeline = $True)]  [string[]]$name)             
Begin {$report = @()}
Process { 
    foreach ($computer in $name) {
        write-host Checking $computer. 
        if ( Test-Connection svc -ErrorAction SilentlyContinue -Count 1    ) {
            $sessions = query session /server:$computer
            1..($sessions.count -1) | % {
                $temp = "" | Select Computer,SessionName, Username, Id, State, Type, Device
                $temp.Computer = $computer
                $temp.SessionName = $sessions[$_].Substring(1,18).Trim()
                $temp.Username = $sessions[$_].Substring(19,20).Trim()
                $temp.Id = $sessions[$_].Substring(39,9).Trim()
                $temp.State = $sessions[$_].Substring(48,8).Trim()
                $temp.Type = $sessions[$_].Substring(56,12).Trim()
                $temp.Device = $sessions[$_].Substring(68).Trim()
                $report += $temp
            } 
        }
    }
}
End {$report}
}

Exemple d’utilisation :

# Get-RDPSession -name svctxpd01 -ErrorAction silentlycontinue

Dans le cadre d’un AD, et en s?lectionnant que certains serveurs :

import-module activedirectory
Get-RDPSession -name (get-adcomputer -Filter 'Name -like "VM_DESK*"' | select -ExpandProperty name ) | Out-GridView

Tout l’AD :

Get-RDPSession -name (get-adcomputer -Filter * | select -ExpandProperty name ) | Out-GridView

Un autre AD que l’AD principal:

Get-RDPSession -name (Get-ADComputer -Server DC_AUTRE_DOMAINE -filter 'name -like "*"' | select -ExpandProperty name ) | Out-GridView

Bref… que du bonheur !!!

Nov 192013
 

# Changer le comportement en cas d’erreur (get-help about_Preference_Variable)

$ErrorActionPreference='Inquire'

# OU

$ErrorActionPreference='Stop'

# Executer une commande a distance (n?cessite que les services soient configur?s via ‘Enable-PSRemoting’

Enter-PSSessionHOSTNAME

# Connaitre la version PowerShell

$PSVersionTable

# Forcer l’utilisation d’une version sp?cifique de powershell:

powershell-version2.0

# V?rifier les actions qui seront faites sans les executer r?ellement : # Ajouter le parametre ?WhatIf # Jouer avec la date:

(get-date).addDays(-7)

# Faire du caasting de valeur :

[string]$objet

# Connaitre TOUTES les donn?es renvoy?es par une fonction.

Get-Process|Get-Member

# Logguer nos actions dans un fichier de log :

Start-Transcript‘fichierdelog.txt’ Stop-Transcript

# Ne choisir que les 3 derniers enregistrements d’un tableau de donn?e:

$a=get-process $a[-3..-1]

# Filtrer les enregistrements: Chercher tous les processus powershell ou powershell_ise dont le temps d’occupation CPU a d?pass? 5 secondes.

Get-Process|Where-Object { ($_.name -eq‘powershell’-or$_.name -eq‘powershell_ise’) -and ($_.CPU -gt5 )}

# Ne conserver que quelques champs (pas un filtre)

Get-Process|Select-ObjectName,CPU,ID

# Trier les champs dans l’ordre inverse

Get-Process|sortID-Descending

# Aller chercher les valeurs Minimales et Maximales de CPU de certains processus

Get-Process-Namesvchost|sort-Objectcpu|select-First1-Last1

# Cr?er des champs suppl?mentaires calcul?s

Get-Process-Namesvchost|selectname,npm,pm, @{label=‘Somme’;expression={$_.PM +$_.NPM}}

# Boucler sur chaque record.

Get-Process-namesvchost|ForEach-Object

#Sauver des donn?es dans un fichier texte

Get-Process|out-file’fichier.txt’

get-process|select*|out-file’fichier.txt’

# Sauver la liste de tous les services d?marr?s. Ne conserver que les propri?t?s du nom de service ainsi que son statut. Le tout, tri? sur le nom du service par ordre croissant.

Get-Service|selectname,status|Where-Object { $_.status -eq« Running »} |Out-Filelab1.txt

# D?marrer tous les services dont le nom commence par la lattre ‘a’ et afficher sur la console le service qui a ?t? d?marr?.

Get-Service-name’a*’|Where-Object { $_.Status -ne‘Running’ } |ForEach-Object { $a=$_.name ; write-host« Demarrage de $a « ; Start-Service-name$a}

# ou

Get-Service-name’a*’|Where-Object { $_.Status -ne‘Running’ } |ForEach-Object { $a=$_.name ; write-host« Demarrage de $a « ; $_.Start()}

# lister les services qui commencent par ‘A’:

Get-Service-name’a*’

# ou

Get-Service|Where-Object { $_.name -like‘a*’ }

# g?n?rer un rapport indiquant la liste des processus ayant consomm? plus d’une minute de temps CPU. On ne veux que cette valeur et le nom du processus.

Get-Process|Select-Objectname,cpu|Where-Object { $_.cpu -gt1 }

# Enregistrer dans un fichier texte les 3 erreurs les plus r?centes du log systeme en ne gardant que la date, le num?ro d’erreur, et le message d’erreur.

$a=Get-EventLog-LogNameSystem?EntryTypeError $a[-3..-1]

# ou

Get-EventLog-LogNameSystem-EntryTypeError-Newest3

# Faire des statistiques

Get-Process|Measure-Objectcpu,pm-Average-Minimum-Maximum-Sum

# Trier des enregistrements, ne sortir que les 4 premiers, mais sauter les 3 premiers

Get-Process|Sort-Objectcpu-Descending|Select-Object-first4-skip3

# Sauver dans un fichier HTML les 10 derniers warnings du log systeme:

Get-EventLog-LogNameSystem-Newest10-EntryTypeWarning|ConvertTo-Html|out-file’c:\sample.html’

# On dispose d’une liste de nom de machine dans un fichier texte (1 nom de machine par ligne). On d?sire connaitre l’?tat du service ‘bits’ sur toutes ces machines

Get-Contentc:\liste.txt|ForEach-Object { get-service-nameBITS-ComputerName$_ }

#ou

get-service-nameBITS-ComputerName (Get-Content(‘C:\liste.txt’))

#Envoyer un r?sultat vers 2 directions : TEE

Get-Processpowershell*|Tee-Object-variableredirection1|Select-Objectprocessname

$redirection1

# Prendre la VALEUR sans l’objet (la valeur string par exemple)

Get-Processpowershell|select-expandPropertyname

# Lier des commandes entre elles.

# Si une commande envois des objets et qu’il n’y a pas de lien entre les noms de propri?t?s et les noms des parametres : Cr?er un LABEL

getADDomainController|select*,@{label=‘ComputerName’;expression={$_.hostname}} |get-service-nameDNS

# Cr?er un « Drive » connect? sur l’AD, la base de registre pour le parcourir comme dans un r?pertoire :

New-PSDrive-PSProviderActiveDirectory-nameAD-root’ou=sales,dc=domaine,dc=com’

set-locationAD:

# les lister :

Get-PSDrive

# Exercice : Cr?er un TREESIZE

Get-ChildItem-AttributesD|ForEach-Object {

$taille=0

Get-ChildItem-path$_.Name -Recurse|ForEach-Object {

$taille=$taille+$_.Length

}

Write-Host$_.Name $taille

}

# Sortir la liste complete de TOUTES les propri?t?s de maniere recursive

get-process|Format-Custom

# Cr?er des champs CUSTOM.

Get-Process|Format-Table-PropertyName,ID,@{n=‘VM(MB)’;

e={$PSItem.VM /1MB};

formatString=‘N2’;

align=‘right’} -AutoSize

# Afficher des donn?es sous forme de tableau graphique interractif

get-process|Out-GridView

# Faire une interface graphique de selection de records avant de passer ces elements a autre chose: ##### UTILE #####

get-process|Out-GridView-PassThru|selectprocessNameCPU

# Cr?er un objet COM pour interragir avec

$objetCom=New-Object-ComObjectwscript.network

$objetCom|Get-Member

# Bypasser la limitation qui empeche de lancer des scripts (l’ordre des parametres a de l’importance)

powershell-executionpolicyunrestricted-filec:\script.ps1

# Manipuler du WMI

Get-WmiObjectWin32_volume|Where-Object {$_.DriveLetter -eq‘C:’} |selectDriveLetter,capacity,freespace, @{label=‘EspaceLibre (Gb)’;expression={$_.freespace/1GB}}

Get-WmiObject-query’SELECT DriveLetter,Freespace FROM win32_volume WHERE DriveLetter= »C: » ‘

?

Déc 262012
 

@echo off
setlocal enabledelayedexpansion

set /a nbFichier=0
for /f %%a in (‘forfiles /P « C:\SCRIPTING\export\20121225 »? /D -1 ‘) do set /a nbFichier=!nbFichier! +1
echo Nombre de fichiers : %nbFichier%

 

— Autre version

 

@echo off
setlocal enabledelayedexpansion

set /a nbFichier=0
for /f « tokens=* » %%a in (‘dir « C:\SCRIPTING\export\20121225 » /A:-d /b ‘) do set /a nbFichier=!nbFichier! +1
echo Nombre de fichiers : %nbFichier%

 

Le 1er script ne fonctionne pas avec les chemins r?seaux, mais supporte des choix de date (voir commande « forfiles »)
Le 2?me script supporte les chemins r?seaux, mais ne supporte pas le choix de dates.