Question
Découper un retour de commande en section
- Burgun
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 40
- Remerciements reçus 0
il y a 12 ans 10 mois #14711
par Burgun
Découper un retour de commande en section a été créé par Burgun
Bonjour,
Je me permets de soumettre mon petit soucis.
Je cherche à identifier un driver défaillant sur un parc de machine.
Pour cela j'utilise l'outil \"prndrvr.vbs\" qui permet de lister,ajouter ou supprimer un driver sur un poste distant.
Pour l'instant, je ne fais que lister les postes
Voici mon script
[code:1]
##Importation des modules
Import-Module ActiveDirectory
##Récupération des PC
$PC=Get-ADComputer -Filter * -SearchBase \"OU=Gestion Ordinateurs,DC=mondomaine,DC=fr\"
#Définition du chemin et des binaire
$PathBin=\"D:\pathbin\"
$Bin=\"cscript prndrvr.vbs\"
#Définition du fichier journal
$Journal=\"c:\temp\Rechercher_Driver_HS.csv\"
$null > $Journal
#Fonction pour récuperer le user connecté
function Get-MyLoggedOnUsers
{
param([Array]$Computer)
Get-WmiObject Win32_LoggedOnUser -ComputerName $Computer |
Select __SERVER, Antecedent -Unique |
%{\"{0} : {1}\{2}\" -f $_.__SERVER, $_.Antecedent.ToString().Split('\"')[1], $_.Antecedent.ToString().Split('\"')[3]}
}
#Placement dans le chemin des binaire
Set-Location $PathBin
#Début du traitement
foreach ($Machine in $PC)
{
$NOM=$Machine.Name
#Création de la commande de listing des imprimantes
$Command=\"$Bin -l -s $NOM\"
#Test si la machine répond
if (test-connection \"$NOM\" -count 2 -quiet)
{
$Result = invoke-Expression $Command
#Recherche du driver
$TEST=$Result | Select-String \"hpcpn6de\"
if ($TEST)
{
#Identification du user qui a un poste avec le driver pourri
[string]$Users=(Get-MyLoggedOnUsers \"$NOM\" | Select-String \"OFIVALMO\"«»)[0]
$User=$Users.split(\":\"«»)[1]
echo \"$NOM;Driver problématique présent;$User\" >> $Journal
}
else
{
echo \"$NOM;OK\" >> $Journal
}
}
else
{
echo \"$NOM;ne répond pas au ping\" >> $Journal
}
}
[/code:1]
Mon problème concerne la suite, c'est a dire supprimer le driver et l'imprimante associé. Pour cela prndrvr.vbs prend plusieurs parametre que je dois pouvoir récupérer.
cscript prndrvr.vbs -d -m DriverName -v {0 | 1 | 2 | 3} -e Environment
Je dois donc pouvoir récuperer \"DriverName\" et \"Environment\" dans la sortie de la commande de listing des drivers
Voici un exemple de retour
Server name MONPC
Driver name Citrix Universal Printer,3,Windows NT x86
Version 3
Environment Windows NT x86
Monitor name
Driver path C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\Cpupdrv.d
Data file C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CitrixUpd.t
Config file C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\Cpupdui.d
Help file
Dependent files
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\cupdres_en.dll
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\cupdres_de.dll
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\cupdres_fr.dll
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\cupdres_ja.dll
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\cupdres_es.dll
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\cupdres_zh-CN.dll
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\upprn.dll
Server name MONPC
Driver name Canon iR C2880/C3380 UFR II,3,Windows NT x86
Version 3
Environment Windows NT x86
Monitor name
Driver path C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CNLB0M_D2
Data file C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\IRC338ZF.XP
Config file C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CNLB0MUI_
Help file C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CNLB0F_D247
Dependent files
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CNLB040C_D2473.DLL
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\IRC338ZF.UPD
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CNLB_15A.DAT
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CNXP0RSW.DLL
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CNXP0LOG.DLL
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\AUSSDRV.DLL
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CNXD0250.DAT
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CPC10S.DLL
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CPC10D.EXE
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CPC10Q.EXE
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CPC1FR.DLL
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CNXPCF32.DLL
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\UCS32P.DLL
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CNXPTN32.DLL
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CNXPCP32.DLL
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CPC10E.DLL
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CPC1FR.CHM
J'identifie le driver par l'utilisation d'une DLL, le driver lui peut prendre des noms différents.
Tout ca pour dire que je cherche un moyen via PS de découper le retour de la commande de listing par section, chaque section étant les caractéristiques d'un driver. Par la suite pour chaque section, je cherche la DLL incriminée, je récupére le nom du driver et lance la commande de suppression.
Ma problèmatique est donc de pouvoir distinguer chaque section dans le retour de la commande. Par exemple, detecter chaque nouveau driver par le mot clef \"Server Name\", considérer toute le suite comme faisant partie d'un lot et le stocker dans une variable jusqu'au prochaine \"Server Name\"
j'arrive bien à utiliser la commande \"split\" pour découper une ligne, mais comment faire quand on veut découper des 'sections de lignes' ?
Cordialement
Je me permets de soumettre mon petit soucis.
Je cherche à identifier un driver défaillant sur un parc de machine.
Pour cela j'utilise l'outil \"prndrvr.vbs\" qui permet de lister,ajouter ou supprimer un driver sur un poste distant.
Pour l'instant, je ne fais que lister les postes
Voici mon script
[code:1]
##Importation des modules
Import-Module ActiveDirectory
##Récupération des PC
$PC=Get-ADComputer -Filter * -SearchBase \"OU=Gestion Ordinateurs,DC=mondomaine,DC=fr\"
#Définition du chemin et des binaire
$PathBin=\"D:\pathbin\"
$Bin=\"cscript prndrvr.vbs\"
#Définition du fichier journal
$Journal=\"c:\temp\Rechercher_Driver_HS.csv\"
$null > $Journal
#Fonction pour récuperer le user connecté
function Get-MyLoggedOnUsers
{
param([Array]$Computer)
Get-WmiObject Win32_LoggedOnUser -ComputerName $Computer |
Select __SERVER, Antecedent -Unique |
%{\"{0} : {1}\{2}\" -f $_.__SERVER, $_.Antecedent.ToString().Split('\"')[1], $_.Antecedent.ToString().Split('\"')[3]}
}
#Placement dans le chemin des binaire
Set-Location $PathBin
#Début du traitement
foreach ($Machine in $PC)
{
$NOM=$Machine.Name
#Création de la commande de listing des imprimantes
$Command=\"$Bin -l -s $NOM\"
#Test si la machine répond
if (test-connection \"$NOM\" -count 2 -quiet)
{
$Result = invoke-Expression $Command
#Recherche du driver
$TEST=$Result | Select-String \"hpcpn6de\"
if ($TEST)
{
#Identification du user qui a un poste avec le driver pourri
[string]$Users=(Get-MyLoggedOnUsers \"$NOM\" | Select-String \"OFIVALMO\"«»)[0]
$User=$Users.split(\":\"«»)[1]
echo \"$NOM;Driver problématique présent;$User\" >> $Journal
}
else
{
echo \"$NOM;OK\" >> $Journal
}
}
else
{
echo \"$NOM;ne répond pas au ping\" >> $Journal
}
}
[/code:1]
Mon problème concerne la suite, c'est a dire supprimer le driver et l'imprimante associé. Pour cela prndrvr.vbs prend plusieurs parametre que je dois pouvoir récupérer.
cscript prndrvr.vbs -d -m DriverName -v {0 | 1 | 2 | 3} -e Environment
Je dois donc pouvoir récuperer \"DriverName\" et \"Environment\" dans la sortie de la commande de listing des drivers
Voici un exemple de retour
Server name MONPC
Driver name Citrix Universal Printer,3,Windows NT x86
Version 3
Environment Windows NT x86
Monitor name
Driver path C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\Cpupdrv.d
Data file C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CitrixUpd.t
Config file C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\Cpupdui.d
Help file
Dependent files
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\cupdres_en.dll
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\cupdres_de.dll
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\cupdres_fr.dll
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\cupdres_ja.dll
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\cupdres_es.dll
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\cupdres_zh-CN.dll
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\upprn.dll
Server name MONPC
Driver name Canon iR C2880/C3380 UFR II,3,Windows NT x86
Version 3
Environment Windows NT x86
Monitor name
Driver path C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CNLB0M_D2
Data file C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\IRC338ZF.XP
Config file C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CNLB0MUI_
Help file C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CNLB0F_D247
Dependent files
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CNLB040C_D2473.DLL
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\IRC338ZF.UPD
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CNLB_15A.DAT
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CNXP0RSW.DLL
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CNXP0LOG.DLL
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\AUSSDRV.DLL
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CNXD0250.DAT
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CPC10S.DLL
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CPC10D.EXE
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CPC10Q.EXE
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CPC1FR.DLL
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CNXPCF32.DLL
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\UCS32P.DLL
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CNXPTN32.DLL
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CNXPCP32.DLL
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CPC10E.DLL
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\CPC1FR.CHM
J'identifie le driver par l'utilisation d'une DLL, le driver lui peut prendre des noms différents.
Tout ca pour dire que je cherche un moyen via PS de découper le retour de la commande de listing par section, chaque section étant les caractéristiques d'un driver. Par la suite pour chaque section, je cherche la DLL incriminée, je récupére le nom du driver et lance la commande de suppression.
Ma problèmatique est donc de pouvoir distinguer chaque section dans le retour de la commande. Par exemple, detecter chaque nouveau driver par le mot clef \"Server Name\", considérer toute le suite comme faisant partie d'un lot et le stocker dans une variable jusqu'au prochaine \"Server Name\"
j'arrive bien à utiliser la commande \"split\" pour découper une ligne, mais comment faire quand on veut découper des 'sections de lignes' ?
Cordialement
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.070 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Découper un retour de commande en section