Question Enregistrer liste dans une table sql server

Plus d'informations
il y a 12 ans 1 mois #16915 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]

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

Plus d'informations
il y a 12 ans 1 mois #16917 par Philippe
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) :blink:<br><br>Message édité par: 6ratgus, à: 11/02/14 10:27

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

Plus d'informations
il y a 12 ans 1 mois #16918 par gouzerh
Merci, j'avais remarqué l'erreur juste après avoir envoyé :blush:

Du coup j'ai fais une modif pour au moins obtenir le nom du premier logiciel qui est composé comme cela : \&quot;7-Zip 9.20 \&quot; ( 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 = \&quot;Data Source=********\*******;database=logicielsPc;Uid=*****;Pwd=*****
$SqlConnection.Open()

#Supprimer la table
$qSQL = \&quot; IF OBJECT_ID('logicielsPc..$NomCalif') IS NOT NULL DROP TABLE $NomCalif \&quot;
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandText = $qSQL
$SqlCmd.Connection = $SqlConnection
$SqlCmd.ExecuteNonQuery();


#Création de la table
$qSQL = \&quot;IF OBJECT_ID('logicielsPc..$NomCalif') IS NULL CREATE TABLE $NomCalif (id int IDENTITY(1,1) PRIMARY KEY, nomLogiciel varchar(99), versionLogiciel varchar(99))\&quot;
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandText = $qSQL
$SqlCmd.Connection = $SqlConnection
$SqlCmd.ExecuteNonQuery()

foreach ($line in $SoftName) {

Write-Host $line

$qSQL = \&quot;INSERT INTO $NomCalif VALUES '$($line)'\&quot;
$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.

Plus d'informations
il y a 12 ans 1 mois #16921 par Philippe
ta syntaxe pour insert n'est pas bonne
essai avec ca :

[code:1]$qSQL = \&quot;INSERT INTO $NomCalif (nomLogiciel) VALUES ('$($line)')\&quot;[/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.

Plus d'informations
il y a 12 ans 1 mois #16923 par gouzerh
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 ? :unsure:

[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 = \&quot;Data Source=************\*************;database=logicielsPc;Uid=*****;Pwd=******\&quot;
$SqlConnection.Open()

#Supprimer la table
$qSQL = \&quot; IF OBJECT_ID('logicielsPc..$NomCalif') IS NOT NULL DROP TABLE $NomCalif \&quot;
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandText = $qSQL
$SqlCmd.Connection = $SqlConnection
$SqlCmd.ExecuteNonQuery();


#Création de la table
$qSQL = \&quot;IF OBJECT_ID('logicielsPc..$NomCalif') IS NULL CREATE TABLE $NomCalif (id int IDENTITY(1,1) PRIMARY KEY, nomLogiciel varchar(99), versionLogiciel varchar(99))\&quot;
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandText = $qSQL
$SqlCmd.Connection = $SqlConnection
$SqlCmd.ExecuteNonQuery()
#Insertion données
$qSQL = $Soft|%{ \&quot;INSERT INTO $NomCalif VALUES ('{0}', '{1}' )\&quot; -f $_.DisplayName, $_.DisplayVersion}
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandText = $qSQL
$SqlCmd.Connection = $SqlConnection
$SqlCmd.ExecuteNonQuery()

#Ligne vide
$qSQL = \&quot;DELETE FROM $NomCalif WHERE nomLogiciel=''\&quot;
$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.

Plus d'informations
il y a 12 ans 1 mois #16925 par Philippe
il faut remplacer les apostrophes par deux apostrophes

cette ligne devrait fonctionner (travaille fait par powershell) :

[code:1]$qSQL = $Soft|%{ \&quot;INSERT INTO $NomCalif VALUES ('{0}', '{1}' )\&quot; -f $_.DisplayName.replace(\&quot;'\&quot;,\&quot;''\&quot;), $_.DisplayVersion.replace(\&quot;'\&quot;,\&quot;''\&quot;)}
[/code:1]

ou celle ci (travaille fait par SQL) :

[code:1]$qSQL = $Soft|%{ \&quot;INSERT INTO $NomCalif VALUES (replace({0},'''',''''''), replace({1},'''','''''') )\&quot; -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
Propulsé par Kunena