Question Fractionnement chaine caractère

Plus d'informations
il y a 2 ans 10 mois - il y a 2 ans 10 mois #30926 par witness
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 : 
  1. Récupération du nom de l'ordinateur
  2. Récupération de la ligne dans le fichier texte qui contient le nom de l'ordinateur récupéré à l'étape 1
  3. Extraction du nom de l'imprimante à partir de la ligne de texte récupérée à l'étape précédente
  4. 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.

Plus d'informations
il y a 2 ans 10 mois - il y a 2 ans 10 mois #30927 par Arnaud Petitjean
Hello !

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.

Plus d'informations
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 
# 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*"}
renvoie 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.

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

Plus d'informations
il y a 2 ans 10 mois #30938 par Arnaud Petitjean
Je suis ravi d'avoir pu t'aider à atteindre ton objectif ;-)

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.

Plus d'informations
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:
# 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.

Plus d'informations
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....
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
Propulsé par Kunena