Question Récupérer une valeur dans un fichier

Plus d'informations
il y a 13 ans 8 mois #12223 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

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 8 mois #12224 par Richard Lazaro
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 ...)

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.

Plus d'informations
il y a 13 ans 8 mois #12236 par Michael
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: :dry:

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.

Plus d'informations
il y a 13 ans 8 mois #12237 par Richard Lazaro
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.

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.

Plus d'informations
il y a 13 ans 8 mois #12240 par Michael
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 :

\\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.

Plus d'informations
il y a 13 ans 8 mois #12241 par Richard Lazaro
Qu'as tu dans ton fichier ?

Think-MS : (Get-Life).Days | %{ Learn-More }

\\&quot;Problems cannot be solved by the same level of thinking that created them.\\&quot; - Albert Einstein

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.052 secondes
Propulsé par Kunena