Question
Fractionnement chaine caractère
- witness
- Auteur du sujet
- Hors Ligne
- Membre premium
Réduire
Plus d'informations
- Messages : 120
- Remerciements reçus 1
il y a 2 ans 10 mois - il y a 2 ans 10 mois #30926
par witness
Hello Arnaud,
Voilà mon début de script:
Ça fonctionne.
Me reste plus qu'à placer un foreach avec un if pour soit connecter l'imprimante si une ligne contient bien le nom de l'ordinateur, soit renvoyer un message en disant qu'aucune imprimante n'a été trouvé pour cet ordinateur.
Je pense à quelque chose comme ça:
Mais j'ai l'impression qu'il n'aime pas la variable dans la ligne New-Object car il me renvoie un message d'erreur dans powershell:
Pourtant la variable correspond bien au chemin réseau de l'iprimante:
Merci d'avance
Réponse de witness sur le sujet Fractionnement chaine caractère
Bonjour Witness !
Je vais essayer de te mettre sur la voie...
Donc, si je résume, les étapes sont :
- Récupération du nom de l'ordinateur
- Récupération de la ligne dans le fichier texte qui contient le nom de l'ordinateur récupéré à l'étape 1
- Extraction du nom de l'imprimante à partir de la ligne de texte récupérée à l'étape précédente
- Montage de l'imprimante
Facile, non ?
# 1. Récupération du nom de l'ordinateur $myPC = $env:Computername # 2. Récupération de la ligne dans le fichier texte qui contient le nom de l'ordinateur # 2.1 Chargement du fichier texte en mémoire (en supposant que ton fichier soit nommé printers.txt et présent dans c:\temp) $printers = Get-Content -Filepath C:\temp\printers.txt # 2.2. On recherche une ligne de texte qui contient le nom de l'ordinateur $printer = $printers | Where-Object { $_ -like "*myPC*"} $printer -match '.+\:\\\\(?<servername>.+)\\(?<printername>.+)' $printerName = $matches.printername # 3. On connecte l'imprimante. Et là je te laisse réfléchir un peu... ;-)
Hello Arnaud,
Voilà mon début de script:
# Récupération du nom de l'ordinateur
$computername = $env:computername
# Chargement du fichier contenant les imprimantes
$Printerslist = Get-Content -path C:\temp\imprimantes.txt
# On recherche une ligne de texte qui contient le nom de l'ordinateur
$printer = $Printerslist | Where-Object { $_ -like "*$computername*"}
# Récupération du chemin réseau de l'imprimante
$printerpath = ($printer -split ':')[-1]
Ça fonctionne.
Me reste plus qu'à placer un foreach avec un if pour soit connecter l'imprimante si une ligne contient bien le nom de l'ordinateur, soit renvoyer un message en disant qu'aucune imprimante n'a été trouvé pour cet ordinateur.
Je pense à quelque chose comme ça:
ForEach ($print in $Printerslist)
{
If($print -like $computername)
{
(New-Object -ComObject WScript.Network).AddWindowsPrinterConnection("$printerpath")
}
else
{
Write-Output "Il n'y a pas d'imprimante avec le nom "
}
}
Mais j'ai l'impression qu'il n'aime pas la variable dans la ligne New-Object car il me renvoie un message d'erreur dans powershell:
(New-Object -ComObject WScript.Network).AddWindowsPrinterConnection($printerpath)
OperationStopped: Le nom de l’imprimante n’est pas valide. (0x80070709)
Pourtant la variable correspond bien au chemin réseau de l'iprimante:
PS C:\Users> $printerpath
\\server\secretariat
Merci d'avance
Dernière édition: il y a 2 ans 10 mois par witness.
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
- Hors Ligne
- Modérateur
il y a 2 ans 10 mois - il y a 2 ans 10 mois #30927
par Arnaud Petitjean
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Réponse de Arnaud Petitjean sur le sujet Fractionnement chaine caractère
Hello !
Pour faire un test, essaie de connecter une imprimante directement depuis la console PowerShell interactive :
Il n'y a pas de raison que ça ne marche pas...
Aussi va voir ici, ça pourrait t'aider : docs.microsoft.com/fr-fr/powershell/scri...orking-with-printers
Pour faire un test, essaie de connecter une imprimante directement depuis la console PowerShell interactive :
# Exemple
$printerPath = '\\myPrinterServer\MyPrinter'
(New-Object -ComObject WScript.Network).AddWindowsPrinterConnection($printerpath)
Il n'y a pas de raison que ça ne marche pas...
Aussi va voir ici, ça pourrait t'aider : docs.microsoft.com/fr-fr/powershell/scri...orking-with-printers
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Dernière édition: il y a 2 ans 10 mois par Arnaud Petitjean.
Connexion ou Créer un compte pour participer à la conversation.
- witness
- Auteur du sujet
- Hors Ligne
- Membre premium
Réduire
Plus d'informations
- Messages : 120
- Remerciements reçus 1
il y a 2 ans 10 mois #30935
par witness
Réponse de witness sur le sujet Fractionnement chaine caractère
Hello Arnaud,
J'ai fini le script et il fonctionne parfaitement
J'ai juste une question concernant le if.
J'ai pas compris tout de suite qu'en mettant simplement If ($printer), cela suffit à en faire une condition, dans le sens que si la variablerenvoie bien quelque chose, ça valide la condition, alors que si la variable ne renvoie rien, c'est le Else qui s'applique.
Tu me confirmes bien ça ?
Et aussi j'ai pas trouvé tout de suite pour le nom de l'imprimante, d'ailleurs je vois que j'ai laissé la variable $Printername alors qu'au final elle ne me sert pas.
Finalement, ce qu'il attend comme nom d'imprimante dans la ligne pour la mettre par défaut, c'est le nom de chemin de l'imprimante \\server\nom_imprimante, et non le nom à proprement parlé qu'il y a dans les propriétés de l'imprimante.
Maintenant je vais m'atteler à un autre script, à savoir, importer des users dans l'AD à partir d'un fichier csv, j'ai déjà bien avancé dessus, mais j'aimerais complexifier le script en faisant en sorte que les utilisateurs présents dans l'AD mais pas dans mon fichier source soit supprimés, que les utilisateurs présents dans l'AD et présent dans mon fichier source restent et éventuellement mettre à jour les données et que les utilisateurs non présents dans l'AD mais présente dans mon fichier source soient créés.
Mais ce n'est pas le sujet de ce post donc je créerai un autre post si besoin.
Merci beaucoup pour ton aide.
J'ai fini le script et il fonctionne parfaitement
# Récupération du nom de l'ordinateur
$computername = $env:computername
# Chargement du fichier contenant les imprimantes
$Printerslist = Get-Content -path C:\temp\imprimantes.txt
# On recherche une ligne de texte qui contient le nom de l'ordinateur
$printer = $Printerslist | Where-Object { $_ -like "*$computername*"}
# Récupération du nom de l'imprimante
$printerpath = ($printer -split ':')[-1]
# On récupérere le nom de l'imprimante
$Printername = ($printerpath -split '\\')[-1]
ForEach ($Print in $Printerslist)
{
If ($printer)
{
(New-Object -ComObject WScript.Network).AddWindowsPrinterConnection($printerpath)
(New-Object -ComObject WScript.Network).SetDefaultPrinter($printerpath)
}
else
{
Write-Output "Il n'y a pas d'imprimante avec le nom "
}
}
J'ai juste une question concernant le if.
J'ai pas compris tout de suite qu'en mettant simplement If ($printer), cela suffit à en faire une condition, dans le sens que si la variable
$printer = $Printerslist | Where-Object { $_ -like "*$computername*"}
Tu me confirmes bien ça ?
Et aussi j'ai pas trouvé tout de suite pour le nom de l'imprimante, d'ailleurs je vois que j'ai laissé la variable $Printername alors qu'au final elle ne me sert pas.
Finalement, ce qu'il attend comme nom d'imprimante dans la ligne pour la mettre par défaut, c'est le nom de chemin de l'imprimante \\server\nom_imprimante, et non le nom à proprement parlé qu'il y a dans les propriétés de l'imprimante.
Maintenant je vais m'atteler à un autre script, à savoir, importer des users dans l'AD à partir d'un fichier csv, j'ai déjà bien avancé dessus, mais j'aimerais complexifier le script en faisant en sorte que les utilisateurs présents dans l'AD mais pas dans mon fichier source soit supprimés, que les utilisateurs présents dans l'AD et présent dans mon fichier source restent et éventuellement mettre à jour les données et que les utilisateurs non présents dans l'AD mais présente dans mon fichier source soient créés.
Mais ce n'est pas le sujet de ce post donc je créerai un autre post si besoin.
Merci beaucoup pour ton aide.
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
- Hors Ligne
- Modérateur
il y a 2 ans 10 mois #30938
par Arnaud Petitjean
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Réponse de Arnaud Petitjean sur le sujet Fractionnement chaine caractère
Je suis ravi d'avoir pu t'aider à atteindre ton objectif
Oui en effet, un if ($mavariable) est équivalent à
On trouve souvent cette syntaxe un peu partout.
Sinon, ton script pourrait être optimisé car tu ne devrais faire ton ForEach que si une imprimante a été trouvée dans ton fichier
Oui en effet, un if ($mavariable) est équivalent à
if ($maVariable -ne $null) {
...
}
On trouve souvent cette syntaxe un peu partout.
Sinon, ton script pourrait être optimisé car tu ne devrais faire ton ForEach que si une imprimante a été trouvée dans ton fichier
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Connexion ou Créer un compte pour participer à la conversation.
- witness
- Auteur du sujet
- Hors Ligne
- Membre premium
Réduire
Plus d'informations
- Messages : 120
- Remerciements reçus 1
il y a 2 ans 10 mois - il y a 2 ans 10 mois #30939
par witness
Réponse de witness sur le sujet Fractionnement chaine caractère
Je pourrais enlever le ForEach et ne laisser qu'un If ?
J'ai essayé ça mais j'ai une erreur concernant Else:
Else : The term 'Else' is not recognized as a name of a cmdlet, function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ Else
+ ~~~~
+ CategoryInfo : ObjectNotFound: (Else:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Merci encore.
J'ai essayé ça mais j'ai une erreur concernant Else:
# Récupération du nom de l'ordinateur
$computername = $env:computername
# Chargement du fichier contenant les imprimantes
$Printerslist = Get-Content -path C:\temp\imprimantes.txt
# On recherche une ligne de texte qui contient le nom de l'ordinateur
$printer = $Printerslist | Where-Object { $_ -like "*$computername*"}
# Récupération du nom de l'imprimante
$printerpath = ($printer -split ':')[-1]
If ($printer)
{
(New-Object -ComObject WScript.Network).AddWindowsPrinterConnection($printerpath)
(New-Object -ComObject WScript.Network).SetDefaultPrinter($printerpath)
}
Else
{
Write-Output "Il n'y a pas d'imprimante pour cet ordinateur"
}
Else : The term 'Else' is not recognized as a name of a cmdlet, function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ Else
+ ~~~~
+ CategoryInfo : ObjectNotFound: (Else:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Merci encore.
Dernière édition: il y a 2 ans 10 mois par witness.
Connexion ou Créer un compte pour participer à la conversation.
- witness
- Auteur du sujet
- Hors Ligne
- Membre premium
Réduire
Plus d'informations
- Messages : 120
- Remerciements reçus 1
il y a 2 ans 10 mois - il y a 2 ans 10 mois #30940
par witness
Réponse de witness sur le sujet Fractionnement chaine caractère
J'ai trouvé que le problème vient du fait que pour placer mon code dans la console powershell afin de tester mon script, j'utilisais le clic droit de la souris après avoir copié le code depuis visual studio code.
Si je fais un copier coller en utilisant ctrl+c puis ctrl + v, l'erreur n'apparait pas.
Je pense qu'il doit y avoir des métadonnées invisibles qui sont ajoutées avec le clic droit.
Si ça peut aider....
Si je fais un copier coller en utilisant ctrl+c puis ctrl + v, l'erreur n'apparait pas.
Je pense qu'il doit y avoir des métadonnées invisibles qui sont ajoutées avec le clic droit.
Si ça peut aider....
Dernière édition: il y a 2 ans 10 mois par witness.
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.094 secondes
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les débutants
- Fractionnement chaine caractère