Question
[Résolu] Powershell et BDD
- PatriceLT
- Auteur du sujet
- Visiteur
-
il y a 7 ans 8 mois #27563
par PatriceLT
[Résolu] Powershell et BDD a été créé par PatriceLT
Bonjour,
Je suis actuellement sur un script qui fait plusieurs choses :
1 - Connexion à une BDD en WID (Windows Internal Database)
2 - Exécution d'un .sql
3 - Récupération des données via Export-Csv
Les 2 choses que je souhaiterai, sont :
1 - La compression de certains fichiers d'export :
Exemple : toto.csv / tata.csv / titi.csv
Je souhaite compresser uniquement toto.csv (le nom de toto.csv est connu et fixe)
2 - Lors de mon extraction de donnée, via l'export-csv de powershell, je souhaite que le nom des colonnes (bdd) soit supprimé, peut-on faire cela, via une option du Export-csv ou dois-je retravailler mon csv ?
Actuellement, mon fichier d'export de base, est un fichier temporaire, ou je fais un get-content dessus, puis un Select -Skip 1 pour ensuite faire un Set-Content vers le fichier final .csv
Voici mon script :
[code:1]
$CheminSortie = \"D:\Patrice\BDD\Export\"
$CheminSQL = \"D:\Patrice\BDD\SQL\"
$NomBDD = \"Patrice\"
$SQLConnexion = New-Object System.Data.SqlClient.SqlConnection
# WID
$SQLConnexion.ConnectionString = \"server=\\.\pipe\MICROSOFT##WID\tsql\query;database=Patrice;Integrated Security=true;\"
$SQLConnexion.Open()
if($SQLConnexion.State -eq \"Open\"«»)
{
$sqlCMD = New-Object System.Data.SqlClient.SqlCommand
$sqlCMD.CommandText = $sqlStr
$sqlCMD.Connection = $SQLConnexion
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $sqlCMD
$SqlAdapter.SelectCommand.CommandTimeout = 600
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
if(!($DataSet.Table[0] -eq $null))
{
$DataSet.Tables[0] | Export-Csv \"$CheminSortie\toto.csv\" -Delimiter \";\" -NoTypeInformation
Get-Content \"$CheminSortie\toto.csv\" | Select -Skip 1 | Set-Content \"$CheminSortie\Extract.csv\" -Encoding Unicode
Remove-Item -Path \"$CheminSortie\toto.csv\"
}
else
{
Write-Host \"[ERREUR] Table vide\"
}
$SQLConnexion.Close()
Start-Sleep 2
}
else
{
Write-Host \"[ERREUR] Impossible d'ouvrir une connexion vers la base\"
}
[/code:1]
Pour le point de la compression de fichier, je ne sais pas comment faire pour que :
Dès que l'export s'est terminé (entre autre, tant que l'export-csv est toujours en cours, l'export se fait, mais dès qu'il a terminé (ce qui peut prendre pour certains exports, pas mal de temps), à ce moment, compresser les fichiers choisis par leur nom.
Y-a-t-il un module sous powershell 5 ou 6 qui permettrait, nativement, sans rien télécharger, une fonction, ou méthode de compression ? qui fait un fichier zip, compress dès que le fichier .csv est terminé ?
Merci par avance !
Bonne journée
Message édité par: PatriceLT, à: 19/09/18 11:56<br><br>Message édité par: Arnaud, à: 20/09/18 15:04
Je suis actuellement sur un script qui fait plusieurs choses :
1 - Connexion à une BDD en WID (Windows Internal Database)
2 - Exécution d'un .sql
3 - Récupération des données via Export-Csv
Les 2 choses que je souhaiterai, sont :
1 - La compression de certains fichiers d'export :
Exemple : toto.csv / tata.csv / titi.csv
Je souhaite compresser uniquement toto.csv (le nom de toto.csv est connu et fixe)
2 - Lors de mon extraction de donnée, via l'export-csv de powershell, je souhaite que le nom des colonnes (bdd) soit supprimé, peut-on faire cela, via une option du Export-csv ou dois-je retravailler mon csv ?
Actuellement, mon fichier d'export de base, est un fichier temporaire, ou je fais un get-content dessus, puis un Select -Skip 1 pour ensuite faire un Set-Content vers le fichier final .csv
Voici mon script :
[code:1]
$CheminSortie = \"D:\Patrice\BDD\Export\"
$CheminSQL = \"D:\Patrice\BDD\SQL\"
$NomBDD = \"Patrice\"
$SQLConnexion = New-Object System.Data.SqlClient.SqlConnection
# WID
$SQLConnexion.ConnectionString = \"server=\\.\pipe\MICROSOFT##WID\tsql\query;database=Patrice;Integrated Security=true;\"
$SQLConnexion.Open()
if($SQLConnexion.State -eq \"Open\"«»)
{
$sqlCMD = New-Object System.Data.SqlClient.SqlCommand
$sqlCMD.CommandText = $sqlStr
$sqlCMD.Connection = $SQLConnexion
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $sqlCMD
$SqlAdapter.SelectCommand.CommandTimeout = 600
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
if(!($DataSet.Table[0] -eq $null))
{
$DataSet.Tables[0] | Export-Csv \"$CheminSortie\toto.csv\" -Delimiter \";\" -NoTypeInformation
Get-Content \"$CheminSortie\toto.csv\" | Select -Skip 1 | Set-Content \"$CheminSortie\Extract.csv\" -Encoding Unicode
Remove-Item -Path \"$CheminSortie\toto.csv\"
}
else
{
Write-Host \"[ERREUR] Table vide\"
}
$SQLConnexion.Close()
Start-Sleep 2
}
else
{
Write-Host \"[ERREUR] Impossible d'ouvrir une connexion vers la base\"
}
[/code:1]
Pour le point de la compression de fichier, je ne sais pas comment faire pour que :
Dès que l'export s'est terminé (entre autre, tant que l'export-csv est toujours en cours, l'export se fait, mais dès qu'il a terminé (ce qui peut prendre pour certains exports, pas mal de temps), à ce moment, compresser les fichiers choisis par leur nom.
Y-a-t-il un module sous powershell 5 ou 6 qui permettrait, nativement, sans rien télécharger, une fonction, ou méthode de compression ? qui fait un fichier zip, compress dès que le fichier .csv est terminé ?
Merci par avance !
Bonne journée
Message édité par: PatriceLT, à: 19/09/18 11:56<br><br>Message édité par: Arnaud, à: 20/09/18 15:04
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 7 ans 8 mois #27568
par Philippe
Réponse de Philippe sur le sujet Re:Powershell et BDD
salut
pour la question 1 tu a Compress-Archive
un exemple d'utilisation tirer de la doc :
[code:1]Compress-Archive -LiteralPath C:\Reference\Draftdoc.docx, C:\Reference\Images\diagram2.vsd –CompressionLevel Optimal -DestinationPath C:\Archives\Draft.Zip[/code:1]
pour le moment de la compress puisque ton script contient en statique les nom de fichiers il suffit de faire la compression apres cette ligne
[code:1]Get-Content \"$CheminSortie\toto.csv\" | Select -Skip 1 | Set-Content \"$CheminSortie\Extract.csv\" -Encoding Unicode
[/code:1]la compression ce ferra des que le set-content sera fini
pour la question 2, le format des CSV est standard et donc il n'est pas prevue de sortir la ligne d'entête
ta méthode est la méthode classic de ce cas
pour la question 1 tu a Compress-Archive
un exemple d'utilisation tirer de la doc :
[code:1]Compress-Archive -LiteralPath C:\Reference\Draftdoc.docx, C:\Reference\Images\diagram2.vsd –CompressionLevel Optimal -DestinationPath C:\Archives\Draft.Zip[/code:1]
pour le moment de la compress puisque ton script contient en statique les nom de fichiers il suffit de faire la compression apres cette ligne
[code:1]Get-Content \"$CheminSortie\toto.csv\" | Select -Skip 1 | Set-Content \"$CheminSortie\Extract.csv\" -Encoding Unicode
[/code:1]la compression ce ferra des que le set-content sera fini
pour la question 2, le format des CSV est standard et donc il n'est pas prevue de sortir la ligne d'entête
ta méthode est la méthode classic de ce cas
Connexion ou Créer un compte pour participer à la conversation.
- PatriceLT
- Auteur du sujet
- Visiteur
-
il y a 7 ans 8 mois #27575
par PatriceLT
Réponse de PatriceLT sur le sujet Re:Powershell et BDD
Merci 6ratgus !!!!
Tu seras toujours mon sauveur, depuis le temps
Le résultat attendu au niveau de la compression, est ok !
Cependant j'ai encore un doute sur le Select -Skip 1, cela peut-il être dangereux ?
Suppression de ligne donc de données, entête manquante ?
Tu seras toujours mon sauveur, depuis le temps
Le résultat attendu au niveau de la compression, est ok !
Cependant j'ai encore un doute sur le Select -Skip 1, cela peut-il être dangereux ?
Suppression de ligne donc de données, entête manquante ?
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 7 ans 8 mois #27577
par Philippe
par contre tu ne peut plus faire d\"export-csv -append vers ce fichier
mais ce semble pas être un problème sur ton script
Réponse de Philippe sur le sujet Re:Powershell et BDD
il n'y a pas de risque puisque l'export-csv met toujours l'entête(les noms de colonnes) au debut du fichierCependant j'ai encore un doute sur le Select -Skip 1, cela peut-il être dangereux ?
Suppression de ligne donc de données, entête manquante ?
par contre tu ne peut plus faire d\"export-csv -append vers ce fichier
mais ce semble pas être un problème sur ton script
Connexion ou Créer un compte pour participer à la conversation.
- PatriceLT
- Auteur du sujet
- Visiteur
-
il y a 7 ans 8 mois #27582
par PatriceLT
Réponse de PatriceLT sur le sujet Re:Powershell et BDD
Effectivement, mais on m'avait conseillé de ne pas faire de skip 1 car cela peut entraîner soit, la suppression de données car l'entête serait manquante, soit de ne rien avoir, mais après plusieurs tests. Cela fonctionne bien.
En ce qui concerne le -append de mon fichier de sortie, tu as raison, aucun besoin, car le script va être scheduling, et donc, 1 fois par jours, le fichier va être généré, puis supprimé après la compression, donc aucun risque que le fichier soit mis à jour car déjà présent.
Du coup, j'ai rajouté un petit test dans mon code à la fin, pour le compress
[code:1]
if(!(Test-Path $CheminZip))
{
Compress-Archive -Path \"$CheminCsv\Toto.csv\" –CompressionLevel Optimal -DestinationPath \"$CheminZip\Test.zip\"
}
else
{
Compress-Archive -Path \"$CheminCsv\Toto.csv\" –CompressionLevel Optimal -DestinationPath \"$CheminZip\Test.zip\" -Update
}
[/code:1]
Du coup, ce qui me permet de vérifier si l'archive à déjà été créé, et au pire, si elle l'a été, de faire un update du fichier ce qui n'est pas plus mal.
En tout cas, merci pour ta confirmation sur mon doute, et cela fonctionne très bien
, ça m'enlève une belle épine du pied
<br><br>Message édité par: PatriceLT, à: 20/09/18 11:49
En ce qui concerne le -append de mon fichier de sortie, tu as raison, aucun besoin, car le script va être scheduling, et donc, 1 fois par jours, le fichier va être généré, puis supprimé après la compression, donc aucun risque que le fichier soit mis à jour car déjà présent.
Du coup, j'ai rajouté un petit test dans mon code à la fin, pour le compress
[code:1]
if(!(Test-Path $CheminZip))
{
Compress-Archive -Path \"$CheminCsv\Toto.csv\" –CompressionLevel Optimal -DestinationPath \"$CheminZip\Test.zip\"
}
else
{
Compress-Archive -Path \"$CheminCsv\Toto.csv\" –CompressionLevel Optimal -DestinationPath \"$CheminZip\Test.zip\" -Update
}
[/code:1]
Du coup, ce qui me permet de vérifier si l'archive à déjà été créé, et au pire, si elle l'a été, de faire un update du fichier ce qui n'est pas plus mal.
En tout cas, merci pour ta confirmation sur mon doute, et cela fonctionne très bien
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.041 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- [Résolu] Powershell et BDD