Question
Récupérer une valeur dans un fichier
- Michael
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 5
- Remerciements reçus 0
il y a 13 ans 8 mois #12223
par Michael
Récupérer une valeur dans un fichier a été créé par Michael
Bonjour à tous,
Je suis novice en scripting et je m'adresse à vous car mes recherches sur le Net n'ont rien donné.
J'utilise un script pour installer une ou plusieurs imprimantes réseau (listées dans un fichier .txt)
exemple du fichier imp.txt :
NOM_DE_PARTAGE_IMPRIMANTE_1
NOM_DE_PARTAGE_IMPRIMANTE_2
NOM_DE_PARTAGE_IMPRIMANTE_3
et voici mon script (qui relis le fichier pour définir l'imprimante la 1ère ligne par défaut) :
[code:1]#Nom du serveur
New-Variable SERVEUR NOM_DU_SERVEUR_IMPRESSION
#Lecture du fichier
$a = (Get-Content C:\imp.txt)
#Installation
Foreach ( $line in $a ) {
$PrinterPath = \"\\\"+$SERVEUR+\"\\"+$line
$net = new-Object -com WScript.Network
$net.AddWindowsPrinterConnection($PrinterPath)
}
#Définition de l'imprimante par défaut
#Lecture de la première ligne du fichier
New-Variable DEFAUT (Get-Content c:\imp.txt -TotalCount 1)
#Définit l'iprimante par défaut
New-Variable OKIMP (\"\\\"+$SERVEUR+\"\\"+$DEFAUT)
(New-Object -ComObject WScript.Network).SetDefaultPrinter($OKIMP)[/code:1]
Le problème : j'ai plusieurs sites, plusieurs sous-réseaux, donc plusieurs serveurs et je souhaiterais que ma variable SERVEUR ne soit pas \"en dur\"...
Je sais lire l'adresse IP de l'ordinateur :
[code:1]#Lecture de l'adresse IP
((ipconfig | findstr [0-9].\.)[0]).Split()[-1]
[/code:1]
J'ai un fichier .txt (séparateur point-virgule) qui me donne le nom du serveur en fonction du sous-réseau
exemple :
10.192.28.;NOM_DU_SERVEUR_IMPRESSION_SITE_1
10.192.228.;NOM_DU_SERVEUR_IMPRESSION_SITE_2
10.193.45.;NOM_DU_SERVEUR_IMPRESSION_SITE_3
Et là, j'atteins mes limites (trop vite
)
Comment dire au script ?:
Ton adresse est 10.192.228.3 donc réseau 10.192.228. donc variable SERVEUR = NOM_DU_SERVEUR_IMPRESSION_SITE_2 alors j'installe toutes les imprimantes trouvées dans imp.txt depuis le bon serveur.
A votre bon coeur,
Cordialement,
Maekeule
Je suis novice en scripting et je m'adresse à vous car mes recherches sur le Net n'ont rien donné.
J'utilise un script pour installer une ou plusieurs imprimantes réseau (listées dans un fichier .txt)
exemple du fichier imp.txt :
NOM_DE_PARTAGE_IMPRIMANTE_1
NOM_DE_PARTAGE_IMPRIMANTE_2
NOM_DE_PARTAGE_IMPRIMANTE_3
et voici mon script (qui relis le fichier pour définir l'imprimante la 1ère ligne par défaut) :
[code:1]#Nom du serveur
New-Variable SERVEUR NOM_DU_SERVEUR_IMPRESSION
#Lecture du fichier
$a = (Get-Content C:\imp.txt)
#Installation
Foreach ( $line in $a ) {
$PrinterPath = \"\\\"+$SERVEUR+\"\\"+$line
$net = new-Object -com WScript.Network
$net.AddWindowsPrinterConnection($PrinterPath)
}
#Définition de l'imprimante par défaut
#Lecture de la première ligne du fichier
New-Variable DEFAUT (Get-Content c:\imp.txt -TotalCount 1)
#Définit l'iprimante par défaut
New-Variable OKIMP (\"\\\"+$SERVEUR+\"\\"+$DEFAUT)
(New-Object -ComObject WScript.Network).SetDefaultPrinter($OKIMP)[/code:1]
Le problème : j'ai plusieurs sites, plusieurs sous-réseaux, donc plusieurs serveurs et je souhaiterais que ma variable SERVEUR ne soit pas \"en dur\"...
Je sais lire l'adresse IP de l'ordinateur :
[code:1]#Lecture de l'adresse IP
((ipconfig | findstr [0-9].\.)[0]).Split()[-1]
[/code:1]
J'ai un fichier .txt (séparateur point-virgule) qui me donne le nom du serveur en fonction du sous-réseau
exemple :
10.192.28.;NOM_DU_SERVEUR_IMPRESSION_SITE_1
10.192.228.;NOM_DU_SERVEUR_IMPRESSION_SITE_2
10.193.45.;NOM_DU_SERVEUR_IMPRESSION_SITE_3
Et là, j'atteins mes limites (trop vite
Comment dire au script ?:
Ton adresse est 10.192.228.3 donc réseau 10.192.228. donc variable SERVEUR = NOM_DU_SERVEUR_IMPRESSION_SITE_2 alors j'installe toutes les imprimantes trouvées dans imp.txt depuis le bon serveur.
A votre bon coeur,
Cordialement,
Maekeule
Connexion ou Créer un compte pour participer à la conversation.
- Richard Lazaro
- Hors Ligne
- Membre platinium
-
Réduire
Plus d'informations
- Messages : 530
- Remerciements reçus 0
il y a 13 ans 8 mois #12224
par Richard Lazaro
Think-MS : (Get-Life).Days | %{ Learn-More }
\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein
Réponse de Richard Lazaro sur le sujet Re:Récupérer une valeur dans un fichier
Bonjour,
Voilà ce que j'ai pu tirer de ta demande, essaye de réutiliser cela (je n'ai pas utilisé de Import-CSV volontairement) :
[code:1]
$serveurs = \"10.192.28;NOM_DU_SERVEUR_IMPRESSION_SITE_1\",\"10.192.228;NOM_DU_SERVEUR_IMPRESSION_SITE_2\",\"10.193.45;NOM_DU_SERVEUR_IMPRESSION_SITE_3\"
$computer = \"10.192.26.3\"
$printers = \"NOM_DE_PARTAGE_IMPRIMANTE_1\",\"NOM_DE_PARTAGE_IMPRIMANTE_2\",\"NOM_DE_PARTAGE_IMPRIMANTE_3\"
$dicServeurs = @{}
$serveurs | ForEach-Object {
$dicServeurs += @{$_.Split(';')[0] = $_.Split(';')[1]}
}
$printers | ForEach-Object {
if(![String]::IsNullOrEmpty($dicServeurs[($computer -replace '\.[^\.]+$','')])) {
Write-Host (\"\\\"+$dicServeurs[($computer -replace '\.[^\.]+$','')]+\"\\"+$_)
} else {
Write-Host 'Impossible de trouver le serveur.'
}
}
[/code:1]
J'utilise une expression régulière pour enlever les derniers octets de l'IP.
Tu remarqueras que 'jai aussi supprimé le dernier . dans le fichier des serverus.
Bien Cordialement,
Richard Lazaro.
(ps : désolé, j'ai pas beaucoup de temps ...)
Voilà ce que j'ai pu tirer de ta demande, essaye de réutiliser cela (je n'ai pas utilisé de Import-CSV volontairement) :
[code:1]
$serveurs = \"10.192.28;NOM_DU_SERVEUR_IMPRESSION_SITE_1\",\"10.192.228;NOM_DU_SERVEUR_IMPRESSION_SITE_2\",\"10.193.45;NOM_DU_SERVEUR_IMPRESSION_SITE_3\"
$computer = \"10.192.26.3\"
$printers = \"NOM_DE_PARTAGE_IMPRIMANTE_1\",\"NOM_DE_PARTAGE_IMPRIMANTE_2\",\"NOM_DE_PARTAGE_IMPRIMANTE_3\"
$dicServeurs = @{}
$serveurs | ForEach-Object {
$dicServeurs += @{$_.Split(';')[0] = $_.Split(';')[1]}
}
$printers | ForEach-Object {
if(![String]::IsNullOrEmpty($dicServeurs[($computer -replace '\.[^\.]+$','')])) {
Write-Host (\"\\\"+$dicServeurs[($computer -replace '\.[^\.]+$','')]+\"\\"+$_)
} else {
Write-Host 'Impossible de trouver le serveur.'
}
}
[/code:1]
J'utilise une expression régulière pour enlever les derniers octets de l'IP.
Tu remarqueras que 'jai aussi supprimé le dernier . dans le fichier des serverus.
Bien Cordialement,
Richard Lazaro.
(ps : désolé, j'ai pas beaucoup de temps ...)
Think-MS : (Get-Life).Days | %{ Learn-More }
\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein
Connexion ou Créer un compte pour participer à la conversation.
- Michael
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 5
- Remerciements reçus 0
il y a 13 ans 8 mois #12236
par Michael
Réponse de Michael sur le sujet Re:Récupérer une valeur dans un fichier
Bonjour et merci d'avoir pris le peu de temps que tu as pour répondre 
On me demande de mettre cette solution en place au plus vite, sans me former ou même me payer un bouquin et les utilisateurs qui vont déployer les postes doivent en faire \"un minimum\" : lister les imprimantes dans imp.txt et le copier sur C:
Je souhaite passer par des fichiers externes pour les raisons suivantes :
- les sites, j'en ai une trentaine (et une quarantaine de sous-réseaux au total !)
- un poste peut-être équipé d'une à cinq imprimantes.
J'ai regardé l'aide de la commande Import-CSV mais je ne trouve pas d'exemple correspondant à ce que je veux faire (et je ne sais pas, étant débutant, si la démarche est bonne):
Les sous-réseaux peuvent être composés comme suit:
xx.xxx.x.0
xx.xxx.xx.0
xx.xxx.xxx.0
C'est pour cela que j'avais gardé le dernier \".\"
Je cherche donc à créer la variable $SERVEUR en :
- lisant l'@ IP du poste
- supprimer le dernier octet de l'IP
- lire le fichier CSV pour trouver une correspondance et, en cas de match, donner pour valeur à $SERVEUR le nom de serveur de la ligne du sous-réseau.
Je pense pouvoir conserver le reste de mon script, à savoir : lecture du fichier imp.txt et mappage de l'imprimante réseau (en créant la connexion avec ma section #Installation)
pour rappel :
[code:1]#Installation
Foreach ( $line in $a ) {
$PrinterPath = \"\\\"+$SERVEUR+\"\\"+$line
$net = new-Object -com WScript.Network
$net.AddWindowsPrinterConnection($PrinterPath)
}[/code:1]
Merci encore pour votre aide (et pour avoir lu mon roman !)
On me demande de mettre cette solution en place au plus vite, sans me former ou même me payer un bouquin et les utilisateurs qui vont déployer les postes doivent en faire \"un minimum\" : lister les imprimantes dans imp.txt et le copier sur C:
Je souhaite passer par des fichiers externes pour les raisons suivantes :
- les sites, j'en ai une trentaine (et une quarantaine de sous-réseaux au total !)
- un poste peut-être équipé d'une à cinq imprimantes.
J'ai regardé l'aide de la commande Import-CSV mais je ne trouve pas d'exemple correspondant à ce que je veux faire (et je ne sais pas, étant débutant, si la démarche est bonne):
Les sous-réseaux peuvent être composés comme suit:
xx.xxx.x.0
xx.xxx.xx.0
xx.xxx.xxx.0
C'est pour cela que j'avais gardé le dernier \".\"
Je cherche donc à créer la variable $SERVEUR en :
- lisant l'@ IP du poste
- supprimer le dernier octet de l'IP
- lire le fichier CSV pour trouver une correspondance et, en cas de match, donner pour valeur à $SERVEUR le nom de serveur de la ligne du sous-réseau.
Je pense pouvoir conserver le reste de mon script, à savoir : lecture du fichier imp.txt et mappage de l'imprimante réseau (en créant la connexion avec ma section #Installation)
pour rappel :
[code:1]#Installation
Foreach ( $line in $a ) {
$PrinterPath = \"\\\"+$SERVEUR+\"\\"+$line
$net = new-Object -com WScript.Network
$net.AddWindowsPrinterConnection($PrinterPath)
}[/code:1]
Merci encore pour votre aide (et pour avoir lu mon roman !)
Connexion ou Créer un compte pour participer à la conversation.
- Richard Lazaro
- Hors Ligne
- Membre platinium
-
Réduire
Plus d'informations
- Messages : 530
- Remerciements reçus 0
il y a 13 ans 8 mois #12237
par Richard Lazaro
Think-MS : (Get-Life).Days | %{ Learn-More }
\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein
Réponse de Richard Lazaro sur le sujet Re:Récupérer une valeur dans un fichier
Bonjour,
Je ne donnais qu'un exemple qu'il faut adapter à votre cas et non une solution clé en main
J'espère que cela a pu vous dépanner.
Bien Cordialement,
Richard Lazaro.
Je ne donnais qu'un exemple qu'il faut adapter à votre cas et non une solution clé en main
J'espère que cela a pu vous dépanner.
Bien Cordialement,
Richard Lazaro.
Think-MS : (Get-Life).Days | %{ Learn-More }
\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein
Connexion ou Créer un compte pour participer à la conversation.
- Michael
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 5
- Remerciements reçus 0
il y a 13 ans 8 mois #12240
par Michael
Réponse de Michael sur le sujet Re:Récupérer une valeur dans un fichier
Je l'avais bien compris comme ça 
J'ai essayé d'adapter votre script mais je bute sur la variable $serveurs (car je tiens à garder mon fichier externe...)
Si je laisse comme vous l'avez écrit :
[code:1]$serveurs = \"10.192.28;NOM_DU_SERVEUR_IMPRESSION_SITE_1\",\"10.192.228;NOM_DU_SERVEUR_IMPRESSION_SITE_2\",\"10.193.45;NOM_DU_SERVEUR_IMPRESSION_SITE_3\"[/code:1]
Ca fonctionne.
J'ai bien le résultat :
J'ai testé la création de $serveurs en lisant le fichier (directement dans la console) :
[code:1] $serveurs = (Get-Content C:\serveurs.txt)
Get-Variable serveurs[/code:1]
j'obtiens bien :
Quand je mets ça dans le script, j'ai autant de lignes \"Impossible de trouver le serveur.\" que dans le fichier imp.txt
Le code modifié :
[code:1]$serveurs = (Get-Content C:\serveurs.txt)
$computer = ((ipconfig | findstr [0-9].\.)[0]).Split()[-1]
$printers = (Get-Content C:\imp.txt)
$dicServeurs = @{}
$serveurs | ForEach-Object {
$dicServeurs += @{$_.Split(';')[0] = $_.Split(';')[1]}
}
$printers | ForEach-Object {
if(![String]::IsNullOrEmpty($dicServeurs[($computer -replace '\.[^\.]+$','')])) {
Write-Host (\"\\\"+$dicServeurs[($computer -replace '\.[^\.]+$','')]+\"\\"+$_)
} else {
Write-Host 'Impossible de trouver le serveur.'
}
}[/code:1]
Message édité par: maekeule, à: 26/06/12 11:14<br><br>Message édité par: maekeule, à: 26/06/12 11:16
J'ai essayé d'adapter votre script mais je bute sur la variable $serveurs (car je tiens à garder mon fichier externe...)
Si je laisse comme vous l'avez écrit :
[code:1]$serveurs = \"10.192.28;NOM_DU_SERVEUR_IMPRESSION_SITE_1\",\"10.192.228;NOM_DU_SERVEUR_IMPRESSION_SITE_2\",\"10.193.45;NOM_DU_SERVEUR_IMPRESSION_SITE_3\"[/code:1]
Ca fonctionne.
J'ai bien le résultat :
\\NOM_DU_SERVEUR_IMPRESSION_SITE_2\IMP_1
\\NOM_DU_SERVEUR_IMPRESSION_SITE_2\IMP_2
etc.
J'ai testé la création de $serveurs en lisant le fichier (directement dans la console) :
[code:1] $serveurs = (Get-Content C:\serveurs.txt)
Get-Variable serveurs[/code:1]
j'obtiens bien :
Name Value
----
serveurs \"10.192.28;NOM_DU_SERVEUR_IMPRESSION_SITE_1\",\"10.192.228;NOM_DU_SERVEUR_IMPRESSION_SITE_2\",...etc
Quand je mets ça dans le script, j'ai autant de lignes \"Impossible de trouver le serveur.\" que dans le fichier imp.txt
Le code modifié :
[code:1]$serveurs = (Get-Content C:\serveurs.txt)
$computer = ((ipconfig | findstr [0-9].\.)[0]).Split()[-1]
$printers = (Get-Content C:\imp.txt)
$dicServeurs = @{}
$serveurs | ForEach-Object {
$dicServeurs += @{$_.Split(';')[0] = $_.Split(';')[1]}
}
$printers | ForEach-Object {
if(![String]::IsNullOrEmpty($dicServeurs[($computer -replace '\.[^\.]+$','')])) {
Write-Host (\"\\\"+$dicServeurs[($computer -replace '\.[^\.]+$','')]+\"\\"+$_)
} else {
Write-Host 'Impossible de trouver le serveur.'
}
}[/code:1]
Message édité par: maekeule, à: 26/06/12 11:14<br><br>Message édité par: maekeule, à: 26/06/12 11:16
Connexion ou Créer un compte pour participer à la conversation.
- Richard Lazaro
- Hors Ligne
- Membre platinium
-
Réduire
Plus d'informations
- Messages : 530
- Remerciements reçus 0
il y a 13 ans 8 mois #12241
par Richard Lazaro
Think-MS : (Get-Life).Days | %{ Learn-More }
\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein
Réponse de Richard Lazaro sur le sujet Re:Récupérer une valeur dans un fichier
Qu'as tu dans ton fichier ?
Think-MS : (Get-Life).Days | %{ Learn-More }
\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.046 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Récupérer une valeur dans un fichier