Question
Enregistrer liste dans une table sql server
- gouzerh
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 12
- Remerciements reçus 0
il y a 12 ans 1 mois #16915
par gouzerh
Enregistrer liste dans une table sql server a été créé par gouzerh
Bonjour !
Je cherche à enregistrer les programmes installés sur la machine dans une table sql server. Une colonne pour l'id qui est un auto incrément , une autre pour le nom du programme et une dernière pour la version. Le problème est que je n'arrive pas a récupérer uniquement la ligne quand je parcours ma variable. Donc ExecuteNonQuery ne marche pas ( problème de syntaxe). Je ne sais pas si je suis clair , peut être que mon bout de code sera plus parlant. Merci d'avance
[code:1]# Récupération du nom d'utilisateur
$IdUser = [Environment]::UserName
# Récupération du nom de la machine
$NomCalif = [Environment]::MachineName
#Récupération dans le registre de la liste (nom et version) des softwares installés sur le Pc.
$SoftName = gp HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Format-Wide DisplayName -Column 1 | Out-String
$SoftVersion = gp HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Format-Wide DisplayVersion -Column 1
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection
$sqlConnection.ConnectionString = \"Data Source=********/********;database=logicielsPc;Uid=*****;Pwd=******\"
$SqlConnection.Open()
#Supprimer la table
$qSQL = \" IF OBJECT_ID('logicielsPc..$NomCalif') IS NOT NULL DROP TABLE $NomCalif \"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandText = $qSQL
$SqlCmd.Connection = $SqlConnection
$SqlCmd.ExecuteNonQuery()
#Création de la table
$qSQL = \"IF OBJECT_ID('logicielsPc..$NomCalif') IS NULL CREATE TABLE $NomCalif (id int IDENTITY(1,1) PRIMARY KEY, nomLogiciel varchar(99) NOT NULL, versionLogiciel varchar(99))\"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandText = $qSQL
$SqlCmd.Connection = $SqlConnection
$SqlCmd.ExecuteNonQuery()
foreach ($line in $soft) {
$qSQL = \"INSERT INTO $NomCalif VALUES '$($softName)', '$($softVersion)'\"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandText = $qSQL
$SqlCmd.Connection = $SqlConnection
$SqlCmd.ExecuteNonQuery()
}
$sqlConnection.Close()
Start-Sleep -Milliseconds 360000[/code:1]
Je cherche à enregistrer les programmes installés sur la machine dans une table sql server. Une colonne pour l'id qui est un auto incrément , une autre pour le nom du programme et une dernière pour la version. Le problème est que je n'arrive pas a récupérer uniquement la ligne quand je parcours ma variable. Donc ExecuteNonQuery ne marche pas ( problème de syntaxe). Je ne sais pas si je suis clair , peut être que mon bout de code sera plus parlant. Merci d'avance
[code:1]# Récupération du nom d'utilisateur
$IdUser = [Environment]::UserName
# Récupération du nom de la machine
$NomCalif = [Environment]::MachineName
#Récupération dans le registre de la liste (nom et version) des softwares installés sur le Pc.
$SoftName = gp HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Format-Wide DisplayName -Column 1 | Out-String
$SoftVersion = gp HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Format-Wide DisplayVersion -Column 1
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection
$sqlConnection.ConnectionString = \"Data Source=********/********;database=logicielsPc;Uid=*****;Pwd=******\"
$SqlConnection.Open()
#Supprimer la table
$qSQL = \" IF OBJECT_ID('logicielsPc..$NomCalif') IS NOT NULL DROP TABLE $NomCalif \"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandText = $qSQL
$SqlCmd.Connection = $SqlConnection
$SqlCmd.ExecuteNonQuery()
#Création de la table
$qSQL = \"IF OBJECT_ID('logicielsPc..$NomCalif') IS NULL CREATE TABLE $NomCalif (id int IDENTITY(1,1) PRIMARY KEY, nomLogiciel varchar(99) NOT NULL, versionLogiciel varchar(99))\"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandText = $qSQL
$SqlCmd.Connection = $SqlConnection
$SqlCmd.ExecuteNonQuery()
foreach ($line in $soft) {
$qSQL = \"INSERT INTO $NomCalif VALUES '$($softName)', '$($softVersion)'\"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandText = $qSQL
$SqlCmd.Connection = $SqlConnection
$SqlCmd.ExecuteNonQuery()
}
$sqlConnection.Close()
Start-Sleep -Milliseconds 360000[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 1778
- Remerciements reçus 21
il y a 12 ans 1 mois #16917
par Philippe
Réponse de Philippe sur le sujet Re:Enregistrer liste dans une table sql server
bonjour Seriale
si je me contente du script donner, dans la dernière boucle il y a une erreur :
[code:1]foreach ($line in $soft) {[/code:1]
$soft n'est pas initialisé
tu n'utilise pas de pointeur pour te déplacé dans les variable $SoftName et $SoftVersion a chaque tour de boucle. ex : $SoftName[$i]
de plus $SoftName et $SoftVersion sont totalement dissocier, ce qui rendra le resultat faux
ton Get-ItemProperty doit remplir une structure \"$soft\" a deux éléments (tableau, collection, ...) que tu utilisera par exemple de cette facon :
[code:1]
foreach ($line in $soft) {
$qSQL = \"INSERT INTO $NomCalif VALUES '$($soft.softName)', '$($soft.softVersion)'\"[/code:1]
pour finir le resultat de tes Get-ItemProperty donne plein de ligne vide (sur mon ordinateur)
<br><br>Message édité par: 6ratgus, à: 11/02/14 10:27
si je me contente du script donner, dans la dernière boucle il y a une erreur :
[code:1]foreach ($line in $soft) {[/code:1]
$soft n'est pas initialisé
tu n'utilise pas de pointeur pour te déplacé dans les variable $SoftName et $SoftVersion a chaque tour de boucle. ex : $SoftName[$i]
de plus $SoftName et $SoftVersion sont totalement dissocier, ce qui rendra le resultat faux
ton Get-ItemProperty doit remplir une structure \"$soft\" a deux éléments (tableau, collection, ...) que tu utilisera par exemple de cette facon :
[code:1]
foreach ($line in $soft) {
$qSQL = \"INSERT INTO $NomCalif VALUES '$($soft.softName)', '$($soft.softVersion)'\"[/code:1]
pour finir le resultat de tes Get-ItemProperty donne plein de ligne vide (sur mon ordinateur)
Connexion ou Créer un compte pour participer à la conversation.
- gouzerh
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 12
- Remerciements reçus 0
il y a 12 ans 1 mois #16918
par gouzerh
Réponse de gouzerh sur le sujet Re:Enregistrer liste dans une table sql server
Merci, j'avais remarqué l'erreur juste après avoir envoyé 
Du coup j'ai fais une modif pour au moins obtenir le nom du premier logiciel qui est composé comme cela : \"7-Zip 9.20 \" ( oui la version est dans le nom). Mais l'ExecuteNonQuery ne fonctionne pas. Exception lors de l'appel de « ExecuteNonQuery » avec « 0 » argument(s) : « Syntaxe incorrecte vers '7-Zip 9.20'. » Et il m'affiche aussi la ligne d'après. Il voit ma ma liste de programmes mais ne veut rien en faire
[code:1]# Récupération du nom d'utilisateur
$IdUser = [Environment]::UserName
# Récupération du nom de la machine
$NomCalif = [Environment]::MachineName
#Récupération dans le registre de la liste (nom et version) des softwares installés sur le Pc.
$SoftName = gp HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Format-Wide DisplayName -Column 1 | Out-String
$SoftVersion = gp HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Format-Wide DisplayVersion -Column 1
$Soft = gp HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection
$sqlConnection.ConnectionString = \"Data Source=********\*******;database=logicielsPc;Uid=*****;Pwd=*****
$SqlConnection.Open()
#Supprimer la table
$qSQL = \" IF OBJECT_ID('logicielsPc..$NomCalif') IS NOT NULL DROP TABLE $NomCalif \"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandText = $qSQL
$SqlCmd.Connection = $SqlConnection
$SqlCmd.ExecuteNonQuery();
#Création de la table
$qSQL = \"IF OBJECT_ID('logicielsPc..$NomCalif') IS NULL CREATE TABLE $NomCalif (id int IDENTITY(1,1) PRIMARY KEY, nomLogiciel varchar(99), versionLogiciel varchar(99))\"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandText = $qSQL
$SqlCmd.Connection = $SqlConnection
$SqlCmd.ExecuteNonQuery()
foreach ($line in $SoftName) {
Write-Host $line
$qSQL = \"INSERT INTO $NomCalif VALUES '$($line)'\"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandText = $qSQL
$SqlCmd.Connection = $SqlConnection
$SqlCmd.ExecuteNonQuery()
}
$sqlConnection.Close()
Start-Sleep -Milliseconds 360000[/code:1]
Du coup j'ai fais une modif pour au moins obtenir le nom du premier logiciel qui est composé comme cela : \"7-Zip 9.20 \" ( oui la version est dans le nom). Mais l'ExecuteNonQuery ne fonctionne pas. Exception lors de l'appel de « ExecuteNonQuery » avec « 0 » argument(s) : « Syntaxe incorrecte vers '7-Zip 9.20'. » Et il m'affiche aussi la ligne d'après. Il voit ma ma liste de programmes mais ne veut rien en faire
[code:1]# Récupération du nom d'utilisateur
$IdUser = [Environment]::UserName
# Récupération du nom de la machine
$NomCalif = [Environment]::MachineName
#Récupération dans le registre de la liste (nom et version) des softwares installés sur le Pc.
$SoftName = gp HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Format-Wide DisplayName -Column 1 | Out-String
$SoftVersion = gp HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Format-Wide DisplayVersion -Column 1
$Soft = gp HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection
$sqlConnection.ConnectionString = \"Data Source=********\*******;database=logicielsPc;Uid=*****;Pwd=*****
$SqlConnection.Open()
#Supprimer la table
$qSQL = \" IF OBJECT_ID('logicielsPc..$NomCalif') IS NOT NULL DROP TABLE $NomCalif \"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandText = $qSQL
$SqlCmd.Connection = $SqlConnection
$SqlCmd.ExecuteNonQuery();
#Création de la table
$qSQL = \"IF OBJECT_ID('logicielsPc..$NomCalif') IS NULL CREATE TABLE $NomCalif (id int IDENTITY(1,1) PRIMARY KEY, nomLogiciel varchar(99), versionLogiciel varchar(99))\"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandText = $qSQL
$SqlCmd.Connection = $SqlConnection
$SqlCmd.ExecuteNonQuery()
foreach ($line in $SoftName) {
Write-Host $line
$qSQL = \"INSERT INTO $NomCalif VALUES '$($line)'\"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandText = $qSQL
$SqlCmd.Connection = $SqlConnection
$SqlCmd.ExecuteNonQuery()
}
$sqlConnection.Close()
Start-Sleep -Milliseconds 360000[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 1778
- Remerciements reçus 21
il y a 12 ans 1 mois #16921
par Philippe
Réponse de Philippe sur le sujet Re:Enregistrer liste dans une table sql server
ta syntaxe pour insert n'est pas bonne
essai avec ca :
[code:1]$qSQL = \"INSERT INTO $NomCalif (nomLogiciel) VALUES ('$($line)')\"[/code:1]
petit cours de insert sql
tu doit indiquer la ou les champ ou tu veut écrire entre parenthèse et après value la ou les valeurs entre parenthèse
aller courage ca va marcher<br><br>Message édité par: 6ratgus, à: 11/02/14 12:17
essai avec ca :
[code:1]$qSQL = \"INSERT INTO $NomCalif (nomLogiciel) VALUES ('$($line)')\"[/code:1]
petit cours de insert sql
tu doit indiquer la ou les champ ou tu veut écrire entre parenthèse et après value la ou les valeurs entre parenthèse
aller courage ca va marcher<br><br>Message édité par: 6ratgus, à: 11/02/14 12:17
Connexion ou Créer un compte pour participer à la conversation.
- gouzerh
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 12
- Remerciements reçus 0
il y a 12 ans 1 mois #16923
par gouzerh
Réponse de gouzerh sur le sujet Re:Enregistrer liste dans une table sql server
C'est bon j'ai réglé mon problème ! Mais un autre est arrivé... Donc je peux injecter ma liste de logiciels dans ma BDD mais quand je fais le test sur un autre poste pu rien. Le problème étant les apostrophes, un nom de logiciel a deux apostrophe et cela empeche le bon fonctionnement du script
Une idée ? 
[code:1]# Récupération du nom d'utilisateur
$IdUser = [Environment]::UserName
# Récupération du nom de la machine
$NomCalif = [Environment]::MachineName
#Récupération dans le registre de la liste (nom et version) des softwares installés sur le Pc.
$Soft = gp HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | select DisplayName,DisplayVersion
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection
$sqlConnection.ConnectionString = \"Data Source=************\*************;database=logicielsPc;Uid=*****;Pwd=******\"
$SqlConnection.Open()
#Supprimer la table
$qSQL = \" IF OBJECT_ID('logicielsPc..$NomCalif') IS NOT NULL DROP TABLE $NomCalif \"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandText = $qSQL
$SqlCmd.Connection = $SqlConnection
$SqlCmd.ExecuteNonQuery();
#Création de la table
$qSQL = \"IF OBJECT_ID('logicielsPc..$NomCalif') IS NULL CREATE TABLE $NomCalif (id int IDENTITY(1,1) PRIMARY KEY, nomLogiciel varchar(99), versionLogiciel varchar(99))\"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandText = $qSQL
$SqlCmd.Connection = $SqlConnection
$SqlCmd.ExecuteNonQuery()
#Insertion données
$qSQL = $Soft|%{ \"INSERT INTO $NomCalif VALUES ('{0}', '{1}' )\" -f $_.DisplayName, $_.DisplayVersion}
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandText = $qSQL
$SqlCmd.Connection = $SqlConnection
$SqlCmd.ExecuteNonQuery()
#Ligne vide
$qSQL = \"DELETE FROM $NomCalif WHERE nomLogiciel=''\"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandText = $qSQL
$SqlCmd.Connection = $SqlConnection
$SqlCmd.ExecuteNonQuery()
$sqlConnection.Close()
[/code:1]
[code:1]# Récupération du nom d'utilisateur
$IdUser = [Environment]::UserName
# Récupération du nom de la machine
$NomCalif = [Environment]::MachineName
#Récupération dans le registre de la liste (nom et version) des softwares installés sur le Pc.
$Soft = gp HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | select DisplayName,DisplayVersion
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection
$sqlConnection.ConnectionString = \"Data Source=************\*************;database=logicielsPc;Uid=*****;Pwd=******\"
$SqlConnection.Open()
#Supprimer la table
$qSQL = \" IF OBJECT_ID('logicielsPc..$NomCalif') IS NOT NULL DROP TABLE $NomCalif \"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandText = $qSQL
$SqlCmd.Connection = $SqlConnection
$SqlCmd.ExecuteNonQuery();
#Création de la table
$qSQL = \"IF OBJECT_ID('logicielsPc..$NomCalif') IS NULL CREATE TABLE $NomCalif (id int IDENTITY(1,1) PRIMARY KEY, nomLogiciel varchar(99), versionLogiciel varchar(99))\"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandText = $qSQL
$SqlCmd.Connection = $SqlConnection
$SqlCmd.ExecuteNonQuery()
#Insertion données
$qSQL = $Soft|%{ \"INSERT INTO $NomCalif VALUES ('{0}', '{1}' )\" -f $_.DisplayName, $_.DisplayVersion}
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandText = $qSQL
$SqlCmd.Connection = $SqlConnection
$SqlCmd.ExecuteNonQuery()
#Ligne vide
$qSQL = \"DELETE FROM $NomCalif WHERE nomLogiciel=''\"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandText = $qSQL
$SqlCmd.Connection = $SqlConnection
$SqlCmd.ExecuteNonQuery()
$sqlConnection.Close()
[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 1778
- Remerciements reçus 21
il y a 12 ans 1 mois #16925
par Philippe
Réponse de Philippe sur le sujet Re:Enregistrer liste dans une table sql server
il faut remplacer les apostrophes par deux apostrophes
cette ligne devrait fonctionner (travaille fait par powershell) :
[code:1]$qSQL = $Soft|%{ \"INSERT INTO $NomCalif VALUES ('{0}', '{1}' )\" -f $_.DisplayName.replace(\"'\",\"''\"), $_.DisplayVersion.replace(\"'\",\"''\")}
[/code:1]
ou celle ci (travaille fait par SQL) :
[code:1]$qSQL = $Soft|%{ \"INSERT INTO $NomCalif VALUES (replace({0},'''',''''''), replace({1},'''','''''') )\" -f $_.DisplayName, $_.DisplayVersion}
[/code:1]
Message édité par: 6ratgus, à: 11/02/14 14:31
Message édité par: 6ratgus, à: 11/02/14 14:32<br><br>Message édité par: 6ratgus, à: 11/02/14 14:32
cette ligne devrait fonctionner (travaille fait par powershell) :
[code:1]$qSQL = $Soft|%{ \"INSERT INTO $NomCalif VALUES ('{0}', '{1}' )\" -f $_.DisplayName.replace(\"'\",\"''\"), $_.DisplayVersion.replace(\"'\",\"''\")}
[/code:1]
ou celle ci (travaille fait par SQL) :
[code:1]$qSQL = $Soft|%{ \"INSERT INTO $NomCalif VALUES (replace({0},'''',''''''), replace({1},'''','''''') )\" -f $_.DisplayName, $_.DisplayVersion}
[/code:1]
Message édité par: 6ratgus, à: 11/02/14 14:31
Message édité par: 6ratgus, à: 11/02/14 14:32<br><br>Message édité par: 6ratgus, à: 11/02/14 14:32
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.054 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Enregistrer liste dans une table sql server