Questions et R�ponses Batch, Scripts, ligne de commande

Retour à la page d'accueil Trucs et Astuces pour NT, 95, ... Boite à outils pour NT Mes amis sur le Web Liens

[bribes/qr_script_sommaire.htm]Par convention :

Script langage de commande (cmd.exe)
Script VBS
Script PowerShell

 

Retour au d�but de la page

Q00 : langages de scripts

mise � jours le 18/02/2009

 

PowerShell 1.0 : Module d'installation Windows PowerShell 1.0 pour Windows Vista (KB928439) [MS KB928439 ]

http://www.microsoft.com/downloads/details.aspx?FamilyID=c6ef4735-c7de-46a2-997a-ea58fdfcba63&displaylang=fr&Hash=ePDADDHvplaoHUWvNysk%2bVd7M5bedZF3KX5Ir7Md9FyCZFGJTX6YKOLPvQdpHbkqJP0gyR9DFWQnilOVdxuXzw%3d%3d

La version CTP3 (Community Technology Preview - avant les b�tas) de PowerShell 2.0 est disponible (attention les CTP sont des versions de validation des fonctionnalit�s. Elles sont "impropres" � l'utilisation en production. Mais c'est souvent int�ressant de se faire la main avec.

La CTP3 de PowerShell 2.0 peut �tre t�l�charg�e via connect ou sur le site de [Microsoft ]

Pour d'autres Informations sur PowerShell voir la page Technologies Microsoft.

 

Retour au d�but de la page

Q01 : Quel �diteurs pour mes scripts

mise � jours le 02/11/2007

 

Pour cr�er un script, il n'est pas n�cessaire d'avoir un outil bien compliqu�, la ligne de commande peut suffire :

Copy con monscript.cmd
Echo Voila mon Script
CTRL+Z

Et voila un petit script cr�� pour l'occasion. Pour l'�diter facilement s'il n'est pas trop important, "Edit" existe toujours m�me sur les plus r�cents syst�mes.

Voila pour les situations d'Urgence, quand on ne veux pas installer d'outils pour se faciliter la vie.

Apr�s dans les situation courantes, on a int�r�t � avoir un outil plus performant qui permet une �dition efficace des scripts. C'est principalement un affaire de go�t mais si vous cherchez quelques outils en voici quelques uns pour commencer :

Retour au d�but de la page

Q2 : G�n�rer un fichier dat�

mise � jours le 02/11/200

J'ai l'habitude de faire en sorte que mes scripts g�n�rent le plus souvent possible une trace de ce qui a �t� fait.
Comme la trace du dernier �v�nement n'est pas toujours suffisamment parlante ou suffisante, j'ai pris l'habitude de g�n�rer des fichiers de trace dat�s style :

C'est la trace d'un mailling qui a �t� envoy� le 21 mail 2007 (2007 05 21).

Comment obtenir l'information qui permet de dater le fichier dans un script BATCH, voila ma recette (m�me si vous en trouverez bien d'autres sur le net).
Voici la premi�re version :

Rem Calcul de la chaine DATE AAAAMMJJ
set D=%DATE:/=%
set D=%D:~4,4%%D:~2,2%%D:~0,2%
Echo %D%

Tr�s satisfaisante sur mon XP ou sur mes serveurs 2003, elle s'est r�v�l�e inadapt�e sur les "vieux" serveurs 2000 parce que la commande date ne renvoie pas la date de la m�me fa�on ("lun 19/09/2006"). Donc voici la "formule" qui marche sur les XP/2003/2000 :

Rem Calcul de la chaine DATE AAAAMMJJ
set WD=%DATE:/=%
if "%WD:~4,1%"=="2" (
set D=%WD:~4,4%%WD:~2,2%%WD:~0,2%
) ELSE set D=%WD:~9,4%%WD:~7,2%%WD:~5,2%
Echo %D%

 

Retour au d�but de la page

Q3 : Sauvegarder l'�tat du syst�me

mise � jours le 02/11/2007

M�me avec l'apparition des points de restauration sous XP, j'ai pris l'habitude de faire une sauvegarde de l'�tat du syst�me d'une station ou d'un serveur avant de faire une op�ration de mise � jours ou d'installation de logiciels.

C'est un op�ration facile � faire � partir de NTBACKP :Lancer NTBACKUP (�viter l'assistant), passer dans l'onglet [Sauvegarder], Cocher System State, et choisir la destination et voila :

L'autre solution qui permet aussi de planifier l'action ou de la lancer automatique sans se poser de question sur le nom du fichier, sa localisation consiste � �crire un petit script pour faire cette action.
Le script � t�l�charger effectue en plus du backup l'envoie d'un mail, la notification � un serveur syslog [Mettre en place un serveur SYslog Fiche-14] et la sauvegarde sur un serveur de centralisation.

@Title Sauvegarde de l'Etat du Syst�me
@rem +----------------------------------------------------------+
@rem + Sauvegarde de l'Etat du syst�me +
@rem + Francois Dunoyer +
@rem + cree : 06/12/2005 +
@rem + Modif : 02/11/2007 +
@rem +----------------------------------------------------------+

:: valeurs par defaut si non configur�es
if "%SMTPS%"=="" Set SMTPS=smtp.Mondomaine.local
 

Set Ext=bkf
:: Par d�faut d�finition du PC de centralisation des Sauvegardes
Set Cible=\\Poste_104
set Dossier=d$\sauvegardes\ES

:: Dans le calcul de la date, on d�tecte si le syst�me est un Windows 2000 qui ne g�re pas l'option clich� instantan�e
:: Et on position une variable qui ajoutera cette option dans le cas des Windows 2003 ou plus

Rem Calcul de la chaine DATE AAAAMMJJ
set WD=%DATE:/=%
if "%WD:~4,1%"=="2" (
set D=%WD:~4,4%%WD:~2,2%%WD:~0,2%
set SNAPON=/snap:on
) ELSE set D=%WD:~9,4%%WD:~7,2%%WD:~5,2%

Set Message=%Action%
now %Message% >%LogBrief%

:: Voila le coeur du script, la backup de l'�tat du systeme

Set BackupName=%Cible%\%dossier%\%ComputerName%-ES-%D%.%Ext%
echo %Backupname%
pause
ntbackup.exe backup systemstate /n "Etat du systeme pour %ComputerName% au %DATE%" /d "ES-%ComputerName%-%D%" /F "%BackupName%" /v:no /r:no /rs:no /hc:off /m normal /j "ES-%ComputerName%-%D%" /l:f %SNAPON%

:: La c'est fini

Script complet � t�l�charger :

 

Retour au d�but de la page

Q04 : Utiliser une "liste" en batch

mise � jours le 22/01/2008

 

Comme utiliser un semblant de liste pour r�p�ter un traitement dans une fichier de commande.

@Title Parcour d'une liste
@rem +----------------------------------------------------------+
@rem + Utilisation d'une liste
@rem + Francois Dunoyer
@rem + cree  : 22/01/2008
@rem + Modif : 22/01/2008
@rem +----------------------------------------------------------+

:: Cr�ation d'une variable

set filelist=Valeur1 Valeur2 Valeur3 Valeur4 Valeur5
set filelist=%filelist% valeur06 valeur07 Valeur08 Valeur09 valeur10
set filelist=%filelist% valeur16 valeur17 Valeur18 Valeur19 valeur20

:: Exploitation de la variable

for %%i in (%filelist%) do (
echo traitement %%i ...
traitement %%i
)

:: La c'est fini

echo.
Echo Voila c'est fini .....

 

Retour au d�but de la page

Q05 : Utiliser un fichier du m�me dossier que le script

mise � jours le 15/10/2008

 

Quand je lance manuelle un script en me positionnant dans son dossier, je n'ai pas de mal � ouvrir un fichier dans le m�me dossier, mais ce n'est pas toujours le cas si je clique sur un raccourci qu'il soit local ou r�seau. Une petite astuce pour pouvoir acc�der aux fichier de param�tre sans connaitre � l'avance le dossier dans lequel le fichier de script est stock�. j'utilise le param�tre %~dp0 qui me renvoie le dossier (d) et le chemin (d) du script en cours.

REM : j'utilise ce script pour marquer mes photos.
REM : le script et le fichier (Setcopyw.ex2) sont dans la racine du dossier, les photos dans un sous-dossier VO
REM : EXIV2 est un tr�s bon outil pour marquer les fichiers image
REM : je n'ai qu'� cliquer sur le script pour taguer mon dossier sans me pr�occuper du r�pertoire en cour

Exiv2 -k -m "%~dp0Setcopyw.ex2" "%~dp0vo\*.jpg"

Retour au d�but de la page

Q06 : G�rer les services en PowerShell

mise � jours le 18/02/2009

Pour g�rer les services via le Powershell les commandes sont les suivantes ( pour s'en rappeler ? get-command *service) :

La syntaxe des commandes Restart-, Stop-, Start-,Suspend-service est similaire. Par exemple :

Pour d�marrer un service :

Start-Service -displayname "planificateur de t�ches"    # en utilisant le nom long
Start-Service schedule                         # en utilisant le nom court

Pour connaitre l'�tat d'un service :

get-wmiobject win32_service | where {$_.Name -eq "schedule"}

Pour connaitre le nom court d'un service particulier :

get-service -displayname "planificateur de t�ches"

D�finir le type de d�marrage pour un service

set-service schedule -startuptype automatic
set-service schedule -startuptype disabled
set-service schedule -startuptype manual

 

Retour au d�but de la page

Q07 : G�rer les process en PowerShell

mise � jours le 18/02/2009

Pour g�rer les process via le powershell les commandes sont les suivantes ( pour s'en rappeler ? get-command *process):

Pour surveiller la pr�sence d'un process :

get-process powershell

Pour stopper une instance d'une application

stop-process -name word

Pour stopper une instance d'une application parmi n instances

PS C:\> get-process excel

Handles NPM(K) PM(K) WS(K)VM(M)CPU(s)Id ProcessName
------- ------ ----- ----- ----- ------ -- ---------
506 18 18080 36212 174 9.482384 EXCEL
459 14 14148 23288 158 1.25 5776 EXCEL

stop-process 5776

et pour les scripteurs fous qui lancent trop de shell powershell, voici comment arr�ter toutes les instances de PowerShell sauf celle o� la commande est lanc�e [Issu du blog de l'�quipe PowerShell : blogs.msdn.com/powershell ]

Get-Process Powershell  | Where-Object { $_.ID -ne $pid } | Stop-Process

Retour au d�but de la page

Q08 : G�rer les services en ligne de commande

mise � jours le 17/02/2009

 

La commande SC

Fonctionnement de la commande SC (commande int�gr�e 2000/2003/XP...) : Cette commande permet d'interagir avec les services de l'ordinateur local ou m�me d'un ordinateur distant (sous r�serve d'avoir les droits n�cessaires et attention aux pare-feux).

Voici quelques exemples d'utilisation de la commande :

Trouver le nom court d'un service

Pour certaines actions il est n�cessaire de conna�tre le � nom court � d�un service, ce � nom court � n�est h�las pas celui qui est affich� dans la console de gestion des services. Pour l�identifier, il suffit de lancer la commande :

SC GETKEYNAME � Nom Long du service �

Par exemple, pour identifier le nom court du service � Workstation Manager � :

SC Getkeyname "Workstation Manger"

[SC] GetServiceKeyName SUCCESS Name = ZFDWM

Changer le compte ou le mot de passe utilis� pour lancer un service

Identifier le nom court du service sur lequel vous voulez intervenir (cf plus haut).

La commande qui va �tre utilis�e pour changer le compte est aussi la commande SC. Pour associer un compte � un service, il suffit de lancer la commande :

SC CONFIG NomCourtDuService obj= Compte password= MotDePasse

Attention : Il y'a un espace obligatoire entre " obj= " et le compte et entre " Password= " et le mot de passe.
Selon le compte utilis� la syntaxe sera l�g�rement diff�rente.

Utilisation d'un compte local � la machine

SC config messenger obj= .\toto password= titi

Utilisation d'un compte d'un domaine AD (DOMAINEAD)

SC config messenger obj= DOMAINEAD\toto password=titi

Utilisation du compte " SYSTEM " (tous Windows)

SC config messenger obj= LocalSystem password= ""

Utilisation d'un compte int�gr� de moindre priorit� (Windows 2003 et plus)

SC config messenger obj= "NT Authority\LocalService" password= ""
SC config messenger obj= "NT Authority\NetworkService" password= ""

Retour au d�but de la page

Q09 : Utiliser le PowerShell dans un script .cmd

mise � jours le 18/02/2009

Il peut �tre int�ressant d'utiliser les possibilit�s du PowerShell pour enrichir ou am�liorer un batch existant (en attendant de le re �crire en PowerShell par exemple :) ). Pour cela, il suffit d'appeler l'interpr�teur PowerShell dans le script et de lui passer en param�tre la commande � ex�cuter :

PowerShell -command get-command

Si la commande est un peu plus compliqu�e... avec un pipe ("|") par exemple la syntaxe se complique un peu :

PowerShell -command "&{ get-command *service | format-table}"

Retour au d�but de la page

Q10 : Ping en PowerShell

mise � jours le 18/02/2009

Le ping est une bonne fa�on de savoir si un serveur ou un poste est toujours "vivant", c'est aussi une bonne fa�on de gagner du temps avant de lancer une commande sur un serveur distant.

Get-WmiObject -Class Win32_PingStatus -Filter "Address='127.0.0.1'"

Get-WmiObject -Class Win32_PingStatus -Filter "Address='127.0.0.1'" | Select-Object -Property Address,ResponseTime,StatusCode

Plus de d�tails : http://winstructor.com/articles/windows-powershell/ping.htm

Retour au d�but de la page

Q11 : Lire ou �crire le registre en PowerShell

mise � jours le 20/02/2009

Lecture de la version du syst�me en cours (en version litt�rale)

# Lecture de la cl� de registre
$value = (get-itemproperty "HKLM:\\SOFTWARE\Microsoft\Windows NT\CurrentVersion")
$Version=$Value.ProductName
$Version

Pour changer la valeur d'une cl� de registre

# Changement du dossier Source pour les installations
# Il s'agit de la valeur SourcePath
Set-ItemProperty -path HKLM:\\SOFTWARE\Microsoft\Windows NT\CurrentVersion -name SourcePath -value "D:\i386"

Pour acc�der au registre distant, voir : http://thepowershellguy.com/blogs/posh/archive/2007/06/20/remote-registry-access-and-creating-new-registry-values-with-powershell.aspx

Retour au d�but de la page

Q99 : Fini ?

Pour le moment.


Le tabac nuit gravement à la santé ! Et la nicotine encrasse non seulement les poumons mais aussi les claviers et les ventilateurs ! Copyright ©1997-2010, François Dunoyer, Dernière modification le