jeudi 14 avril 2011

colorer vos invites de commandes

salut,

malheureusement, dans le shell windows, on n'a pas de commandes native qui permet de colorer nos chaines de caractères, pour pallier à cette lacune on peux télécharger des commandes externes, ou bien pour les puristes on peux bricoler un tuc comme ceci:


@echo off
if "%~2"=="" (
   cls
   echo.
   echo   .SYNTAXE:
   echo. 
   echo        %~n0 BackgroundColor+ForegroundColor chaine
   echo.
   echo  ------------ EXEMPLE 1 --------------
   echo.  
   echo        CMD E:\^> %~n0 0c "hello world"
   echo.
   echo  ------------ EXEMPLE 2 --------------
   echo.
   echo        CMD E:\^> type script.cmd
   echo        @echo off
   echo        call cecho ce "Debut"
   echo        echo processus
   echo        call cecho ec "Fin"
   exit /b 3
)
mkdir $temp || (exit /b 2)
pushd $temp || (rmdir $temp & exit /b 1)
for /f "delims=" %%. in ('
    "%ComsPec% /k prompt $h$h <&1"
 ') do >rtn echo %%.
Call:bfc %1 %2
popd
rmdir /s /q $temp
exit /b 0

:bfc
>%2 (set/P=+) <&1
findstr /a:%1 + %2 con
type rtn
goto :eof

supprimer les dossiers vides

salut,

voici un petit filtre en PS pour supprimer les dossiers vides


Filter Remove-EmptyFolder
{
  try{
   [IO.DirectoryInfo]$Folder=$_
   if($Folder.GetFiles().count -eq 0) {$Folder.Delete()}
  }
  catch{}
}

PS> gci -Recurse | Remove-EmptyFolder



vendredi 4 mars 2011

Call+chemin avec le caractère %

appeler un bat se trouvant dans un dossier %dossier% est embêtant, et peux facilement être tragique si notre %dossier% était une variable valuée...pour contournée ce problème on peux faire ceci:

echo=|call %%dossier%%\srep\fichier.bat
:: ou bien
Cmd /c %%dossier%%\srep\fichier.bat
:: ou bien
cd /d "%%dossier%%\srep"
fichier.bat

Fibonacci en batch

ce beau vieux Fibonacci est desormais devenu une star...


@Echo oFF
Setlocal EnableDelayedExpansion

Set cnt=20
Set /A a=1,b=a
Echo !a!&for /l %%# in (1=1=!cnt!) do (
  set /A c=a+b,a=b,b=c
  Echo=!c!
)
Pause




émulation de la commande externe attrib.exe

Set-Attrib est une fonction qui associe à la fois la simplicité du codage en PS et la puissance de celui-ci:


Function Set-Attrib
{
  param(
   [string]$Path=".",
   [string]$Filter="*",
   [switch]$ReadOnly,
   [switch]$System,
   [switch]$Normal,
   [switch]$Hidden,
   [switch]$Archive,
   [switch]$Recurse
  )
  $attr=@()
  Switch($true)
   {
     $ReadOnly { $attr+='ReadOnly'}
     $Archive  { $attr+='Archive' }
     $Hidden   { $attr+='Hidden'  }
     $System   { $attr+='System'  }
     $Normal   { $attr+='Normal'  }
   }      
 gci -Path $Path -Fi $Filter -Recurse:$Recurse -Fo | `
   Where { -not $_.PSIsContainer } | `
     ForEach {
       $_.PsBase.Attributes=[System.IO.FileAttributes]$attr
     }
 <#
   .SYNOPSIS
       Modifie les attributs des fichiers
   .DESCRIPTION
     Modifie les attributs des fichiers, les attributs supportés sont:
       -ReadOnly: fichier en Lecture seul
       -System  : fichier système
       -Hidden  : fichier caché
       -Archive : fichier archivé
   .PARAMETER Path
     Chemin du répertoire source
   .PARAMETER Filter
     Filtre sur les fichiers à traiter ou bien un nom d'un fichier  
   .PARAMETER Recurse
     recherche recursive  
   .EXAMPLE 
     PS C:\> Set-Attrib -Path c: -Filter boot.ini -Normal
     hôtter du fichier c:\boot.ini les attributs "Sytème" et "Caché"
   .EXAMPLE
     PS C:\> Set-Attrib -Filter *.inf -Recurse -ReadOnly -System
     Modifie tous les attributs des fichiers *.iNF du répértoire courant et tous ses sous répértoie en fichiers "En lecture seul" et "Système"
   .EXAMPLE
     PS C:\> Set-Attrib -Hidden
     Caché tous les fichiers du répertoire en cours    
 #>    
}

samedi 28 août 2010

[POWERSHELL] provider en alias

pour mettre le provider variable: comme alias on passera par une fonction comme ceci

  PS> function global:variable: {"test"}
  PS> set-alias variable: global:variable:
  PS> variable:
test 

Tri numérique

Pour trier des données on a la commande SORT.EXE mais malheureusement elle n'effectue que le trie alphabétique:
Salut,


Pour trier des données on a la commande SORT.EXE mais malheureusement elle n'effectue que le trie alphabétique:

c:\> type fichier1.txt

1 marcoc
2 libye
3 palestine
4 france

c:\> sort /r /+2 fichier1.txt /o trier.txt
c:\> type trier.txt

3 palestine
1 maroc
2 libye
4 france


un autre exemple:

c:\> type fichier2.txt

5
3
6
1

c:\> sort fichier2.txt

1
3
5
6


jusqu'ici tout marche à la perfection, voyons maintenant cette exemple:
c:\> type fichier3.txt

65
1
26894
1125
369

c:\> sort fichier3.txt

1
1125
26894
369
65

comme vous voyez la commande SORT.EXE ne connait pas le trie numérique.

pour contourner ce problème, on peux utiliser la commande externe "gnu sort" avec l'option "-n"
c:\> gnusort -n fichier3.txt

1
65
369
1125
26894

une autre solution est de faire un script émulant la commande "gnusort -n".

Donc l'une des solution possible est de fixer la longueur des chaine de caractères pour qu'il aillent la même longueur, pour se faire on va ajouter des zero "0" à gauche de chaque chaine:
00000001
00001125
00026894
00000369
00000065

ensuite on va les passer à la commande SORT.EXE

c:\> Sort fichier4.txt
00000001
00000065
00000369
00001125
00026894

le trie est effectuer avec succès il nous ne reste plus qu'a enlever les zeros "0" de plus.
1
65
369
1125
26894

et voilà voyons notre script de quoi aura l'air:
@Echo oFF
Setlocal EnableExtensions

Set liste=1 1125 26894 369 65 396

For %%i in (%liste%) Do >>~@ Call :S %%i
For /F "Tokens=*" %%c in ('Sort ~@') do Call:P set "c=%%c"
del ~@
pause
Endlocal & goto :EOF

:S
Set "tz=00000000%1"
Echo:%tz:~-8%
goto :EOF

:P
%*
:z
if (%c:~0,1%)==(0) set "c=%c:~1%" & goto:z
echo=%c% 
goto:EOF


comme vous voyez c'est le bordel !! On essayera alors une autre solution,...que dites-vous de
comparer les nombres, nombre par nombre en décalant chaque chiffre de gauche à droite, le plus grand nombre sera décalé à droite et le plus petit à gauche ? un SORT à bulle...quoi..
@Echo oFF

Call :Sort 1256 280 3 10 2 98 259 563 8
pause
goto :EOF


:Sort
Setlocal EnableDelayedExpansion
Set/A n=1,s=0,c=s,r=s
for %%: In (%*) do (
    Set /a c+=1
    Set "nm.!c!=%%:")
:LP.1
if %s% EQU %c% Set/A n+=1,s=0
    Set/A s+=1
    Call :SPL %n% %s%
If %n% LEQ %c% goto :LP.1
:LP.2
    Echo:!nm.%c%!
    Set/A c-=1
If %c% GTR 0 goto :LP.2 
Endlocal & goto :EOF
:SPL
 If !nm.%1! GTR !nm.%2! (
   Set "t=!nm.%2!"&Set "nm.%2=!nm.%1!"
   Set "nm.%1=!t!"
 ) 
goto :EOF

c'est plus simple..non.. :)