<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog de Dje &#187; Powershell</title>
	<atom:link href="https://blog.developpez.com/dje/pcategory/ms-sql-server/powershell/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/dje</link>
	<description></description>
	<lastBuildDate>Thu, 31 May 2012 20:33:57 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Powershell &#8211; Central Management Server export &#8211; import</title>
		<link>https://blog.developpez.com/dje/p10680/ms-sql-server/powershell_central_management_server_exp_2</link>
		<comments>https://blog.developpez.com/dje/p10680/ms-sql-server/powershell_central_management_server_exp_2#comments</comments>
		<pubDate>Sat, 28 Jan 2012 21:44:26 +0000</pubDate>
		<dc:creator><![CDATA[Ptit_Dje]]></dc:creator>
				<category><![CDATA[MS SQL Server]]></category>
		<category><![CDATA[Powershell]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Mikedavem propose une solution pour exporter la liste des serveurs et groupes contenus dans un CMS. Trouvant la méthode assez compliquée par rapport à ce qu&#8217;il est réalisable au niveau du GUI, je me suis posé la question &#171;&#160;Comment automatiser ce que le GUI fait ?&#160;&#187;. Premier reflexe: SQL Profiler&#8230; Caramba! On ne voit rien passer. Second reflexe (toujours moins naturel celui-la): Powershell ! Pre-requis: La session powershell doit être ouverte sur le serveur ou [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Mikedavem propose <a href="http://blog.developpez.com/mikedavem/p10675/sql-server-2008/migrer-la-configuration-darsquo-un-serve/#more10675">une solution pour exporter la liste des serveurs et groupes contenus dans un CMS</a>.</p>
<p>Trouvant la méthode assez compliquée par rapport à ce qu&rsquo;il est réalisable au niveau du GUI, je me suis posé la question &laquo;&nbsp;Comment automatiser ce que le GUI fait ?&nbsp;&raquo;.</p>
<p>Premier reflexe: SQL Profiler&#8230; Caramba! On ne voit rien passer.</p>
<p>Second reflexe (toujours moins naturel celui-la): Powershell !<br />
<span id="more-15"></span><br />
Pre-requis:<br />
La session powershell doit être ouverte sur le serveur ou le CMS tourne &#8211; ou en utilisant du remote powershell (pas teste).<br />
Le snappin/module (2008/2012) sqlps doit être chargé.</p>
<p>En regardant un peu la documentation, on peut remarquer que sqlps, au travers du provider SqlServer, permet de naviguer au travers des serveurs enregistrés.</p>
<blockquote>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">#Liste des providers <br />
Get-PSProvider <br />
#Liste des &quot;folders&quot; du provider SQLSERVER <br />
set-location SQLSERVER: <br />
ls</div></div>
</blockquote>
<p><img src="http://blog.developpez.com/media/provider.png" width="713" height="424" alt="Provider_SQLServer" /></p>
<p>Pour naviguer on fera comme pour naviguer dans une arborescence de file system:</p>
<blockquote>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">cd .\SQLRegistration #Serveurs enregistrés <br />
cd '.\Central Management Server Group' #CMS (cd pouvez taper cd &lt;tab&gt; et powershell completera la ligne pour vous) <br />
cd .\%2E%5CSQL11 #le nom de mon CMS qui est literalement .\SQL11 - Vive le trick ci-dessus (cd &lt;tab&gt;) pour retrouver le bon nom ;) <br />
ls #presente la liste de serveurs/groupes presents à la racine du CMS</div></div>
</blockquote>
<p><img src="http://blog.developpez.com/media/CMS_location.png" width="780" height="198" alt="CMSLocation" /></p>
<p>Maintenant regardons les méthodes existantes pour l&rsquo;objet dans lequel nous nous trouvons ainsi que de quelle classe est cet objet (si vous débutez avec le powershell et que ceci vous semble bizarre&#8230; C&rsquo;est normal &#8230; Ou pas&#8230; En tout cas c&rsquo;est l&rsquo;effet que ca m&rsquo;a fait ^^):</p>
<blockquote><p>Get-Item . | Get-Member</p></blockquote>
<p>On peut voir que le nom de la classe (TypeName) de l&rsquo;objet est <a href="http://msdn.microsoft.com/fr-fr/library/microsoft.sqlserver.management.registeredservers.servergroup(v=sql.110).aspx">Microsoft.SqlServer.Management.RegisteredServers.ServerGroup</a> et <a href="http://msdn.microsoft.com/fr-fr/library/microsoft.sqlserver.management.registeredservers.servergroup.export(v=sql.110).aspx">une méthode appelée export!</a></p>
<p><img src="http://blog.developpez.com/media/CMS_methods.png" width="964" height="664" alt="CMS_Methods" /></p>
<p>C&rsquo;est cette methode qui va nous servir à réaliser l&rsquo;export.</p>
<p>Voici le script permettant de réaliser cet export (n&rsquo;oubliez pas les pré-requis! et pensez à changer les valeurs des variables ;)):</p>
<blockquote>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$CMSPath = 'SQLSERVER:\SQLRegistration\Central Management Server Group\%2E%5CSQL11' #Location of the Central Management server to be exported <br />
$exportFile = 'C:\Powershell\CMS\cms.xml' #Path of the export file <br />
&nbsp;<br />
set-location $CMSPath <br />
(get-item .).export($exportFile, 'None')</div></div>
</blockquote>
<p>Maintenant, pour l&rsquo;import, même principe en utilisant cette fois ci la méthode&#8230; <a href="http://msdn.microsoft.com/fr-fr/library/microsoft.sqlserver.management.registeredservers.servergroup.import(v=sql.110).aspx">import</a> &#8230; Je suis sur que vous l&rsquo;aviez déjà deviné ;):</p>
<blockquote>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$CMSPath = 'SQLSERVER:\SQLRegistration\Central Management Server Group\%2E%5CSQL11' #Location of the Central Management server where to import <br />
$importFile = 'C:\Powershell\CMS\cms.xml' #Path of the file to import <br />
&nbsp;<br />
set-location $CMSPath <br />
(get-item .).import($importFile)</div></div>
</blockquote>
<p>Voila !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Remonter les informations de capacité des disques avec Powershell</title>
		<link>https://blog.developpez.com/dje/p10587/ms-sql-server/remonter_les_informations_de_capacite_de_1</link>
		<comments>https://blog.developpez.com/dje/p10587/ms-sql-server/remonter_les_informations_de_capacite_de_1#comments</comments>
		<pubDate>Wed, 14 Dec 2011 20:40:24 +0000</pubDate>
		<dc:creator><![CDATA[Ptit_Dje]]></dc:creator>
				<category><![CDATA[MS SQL Server]]></category>
		<category><![CDATA[Powershell]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Voici un petit script permettant de lister l&#8217;ensemble des volumes d&#8217;un serveur et des différents mount points: foreach($volume IN gwmi -Class win32_volume) &#160; { &#160; &#160; $Capacity = $volume.capacity/1073741824; &#160; &#160; &#160; $freeSpace= $volume.freespace/1073741824; &#160; &#160; &#160; $used = $Capacity - $freeSpace; &#160; &#160; &#160; write-host $volume.name ' - Capacity:' $Capacity ' - Free space:' $freespace ' - Used:' $used } On peut l&#8217;étendre facilement pour l&#8217;utiliser sur un serveur distant l&#8217;autorisant grace au paramètre [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Voici un petit script permettant de lister l&rsquo;ensemble des volumes d&rsquo;un serveur et des différents mount points:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">foreach($volume IN gwmi -Class win32_volume) &nbsp;<br />
{ <br />
&nbsp; &nbsp; $Capacity = $volume.capacity/1073741824; &nbsp;<br />
&nbsp; &nbsp; $freeSpace= $volume.freespace/1073741824; &nbsp;<br />
&nbsp; &nbsp; $used = $Capacity - $freeSpace; &nbsp;<br />
&nbsp; &nbsp; write-host $volume.name ' - Capacity:' $Capacity ' - Free space:' $freespace ' - Used:' $used <br />
}</div></div>
<p><span id="more-13"></span><br />
On peut l&rsquo;étendre facilement pour l&rsquo;utiliser sur un serveur distant l&rsquo;autorisant grace au paramètre -ComputerName de l&rsquo;alias gwmi:<br />
(Au passage un peu de cosmétique pour spécifier la mesure des volumes et une petite information intéressante, la taille du block de disque)</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$TargetComputer = &quot;MonServer&quot; <br />
&nbsp;<br />
foreach($volume IN gwmi -ComputerName $TargetComputer -Class win32_volume) &nbsp;<br />
{ <br />
&nbsp; &nbsp; $Capacity = $volume.capacity/1073741824; &nbsp;<br />
&nbsp; &nbsp; $freeSpace= $volume.freespace/1073741824; &nbsp;<br />
&nbsp; &nbsp; $used = $Capacity - $freeSpace; &nbsp;<br />
&nbsp; &nbsp; write-host $volume.name ' - Capacity(GB):' $Capacity ' - Free space(GB):' $freespace ' - Used(GB):' $used ' - Block size(K):' $volume.blocksize <br />
}</div></div>
<p>Allons un peu plus loin et faisons maintenant la meme chose, sur un ensemble de serveurs listés dans un fichier:<br />
Au passage, un petit filtre pour ne prendre que les disques durs locaux.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$monFichierServeur = &quot;c:\powershell\ServerList.txt&quot; <br />
&nbsp;<br />
foreach ($TargetComputer in get-content $monFichierServeur) <br />
{ <br />
&nbsp; foreach($volume IN gwmi -ComputerName $TargetComputer -Class win32_volume) &nbsp;<br />
&nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; if ($volume.DriveType -eq 3) #Filtrons sur les disques durs <br />
&nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$Capacity = $volume.capacity/1073741824; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$freeSpace= $volume.freespace/1073741824; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$used = $Capacity - $freeSpace; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;write-host 'ServerName:' $TargetComputer ' - VolumeName:' &nbsp;$volume.name ' - Capacity(GB):' $Capacity ' - FreeSpace(GB):' $freespace ' - Used(GB):' $used ' - BlockSize(K):' $volume.blocksize <br />
&nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; } <br />
}</div></div>
<p>Continuons un peu le chemin, ca devient dur de s&rsquo;imaginer lire toute une console du listing des volumes de tous nos serveurs:<br />
Ajoutons un fichier de sortie nommer comme avec le nom du serveur au format .csv:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$monFichierServeur = &quot;c:\powershell\ServerList.txt&quot; <br />
$OutPath = &nbsp;&quot;c:\powershell\out\&quot; <br />
&nbsp;<br />
foreach ($TargetComputer in get-content $monFichierServeur) <br />
{ <br />
&nbsp; &nbsp; $outFile = $OutPath + $TargetComputer + &quot;.csv&quot; <br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &quot;&quot;&quot;ServerName&quot;&quot;;&quot;&quot;VolumeName&quot;&quot;;&quot;&quot;Capacity(GB)&quot;&quot;;&quot;&quot;FreeSpace(GB)&quot;&quot;;&quot;&quot;Used(GB)&quot;&quot;;&quot;&quot;BlockSize(K)&quot;&quot;&quot; | out-file $outFile <br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; foreach($volume IN gwmi -ComputerName $TargetComputer -Class win32_volume) &nbsp;<br />
&nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; if ($volume.DriveType -eq 3) #Filtrons sur les disques durs <br />
&nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$Capacity &nbsp; = $volume.capacity/1073741824; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$freeSpace &nbsp;= $volume.freespace/1073741824; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$volumeName = $volume.name &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$blockSize &nbsp;= $volume.blocksize <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$used = $Capacity - $freeSpace; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;&quot;&quot;&quot;+$TargetComputer+&quot;&quot;&quot;;&quot;&quot;&quot;+$volumeName+&quot;&quot;&quot;;&quot;&quot;&quot;+$Capacity+&quot;&quot;&quot;;&quot;&quot;&quot;+$freespace+&quot;&quot;&quot;;&quot;&quot;&quot;+$used+&quot;&quot;&quot;;&quot;&quot;&quot;+$blockSize+&quot;&quot;&quot;&quot; | out-file $outFile -append <br />
&nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; } <br />
}</div></div>
<p>Terminons avec un bout de code a sauvegarder dans un fichier de type .ps1 auquel on peut passer 2 arguments: le nom du fichier de serveur et le path de sortie:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Param <br />
&nbsp; &nbsp; ( <br />
&nbsp; &nbsp; &nbsp; &nbsp; [string]$monFichierServeur, <br />
&nbsp; &nbsp; &nbsp; &nbsp; [string]$outPath <br />
&nbsp; &nbsp; ) <br />
&nbsp;<br />
function get-volumes <br />
&nbsp; &nbsp; ( <br />
&nbsp; &nbsp; &nbsp; &nbsp; [string]$monFichierServeur, <br />
&nbsp; &nbsp; &nbsp; &nbsp; [string]$outPath <br />
&nbsp; &nbsp; ) <br />
&nbsp; &nbsp; &nbsp;<br />
{ <br />
&nbsp; &nbsp; Write-Host $outPath <br />
&nbsp; &nbsp; foreach ($TargetComputer in get-content $monFichierServeur) <br />
&nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; $outFile = $OutPath + &quot;\&quot; + $TargetComputer + &quot;.csv&quot; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;ServerName&quot;&quot;;&quot;&quot;VolumeName&quot;&quot;;&quot;&quot;Capacity(GB)&quot;&quot;;&quot;&quot;FreeSpace(GB)&quot;&quot;;&quot;&quot;Used(GB)&quot;&quot;;&quot;&quot;BlockSize(K)&quot;&quot;&quot; | out-file $outFile <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; foreach($volume IN gwmi -ComputerName $TargetComputer -Class win32_volume) &nbsp;<br />
&nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ($volume.DriveType -eq 3) #Filtrons sur les disques durs <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$Capacity &nbsp; = $volume.capacity/1073741824; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$freeSpace &nbsp;= $volume.freespace/1073741824; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$volumeName = $volume.name &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$blockSize &nbsp;= $volume.blocksize <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$used = $Capacity - $freeSpace; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;&quot;&quot;&quot;+$TargetComputer+&quot;&quot;&quot;;&quot;&quot;&quot;+$volumeName+&quot;&quot;&quot;;&quot;&quot;&quot;+$Capacity+&quot;&quot;&quot;;&quot;&quot;&quot;+$freespace+&quot;&quot;&quot;;&quot;&quot;&quot;+$used+&quot;&quot;&quot;;&quot;&quot;&quot;+$blockSize+&quot;&quot;&quot;&quot; | out-file $outFile -append <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; } <br />
} <br />
&nbsp;<br />
get-volumes $monFichierServeur $outPath</div></div>
<p>Soit le fichier VolumeInfoOutFileParam.ps1, l&rsquo;appel se fait de la manière suivante:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">.\VolumeInfoOutFileParam.ps1 &quot;C:\Powershell\ServerList.txt&quot; &quot;C:\Powershell\Out&quot;</div></div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Powershell &#8211; Invoke-Sqlcmd</title>
		<link>https://blog.developpez.com/dje/p10665/ms-sql-server/powershell_invoke_sqlcmd</link>
		<comments>https://blog.developpez.com/dje/p10665/ms-sql-server/powershell_invoke_sqlcmd#comments</comments>
		<pubDate>Sat, 21 Jan 2012 18:40:32 +0000</pubDate>
		<dc:creator><![CDATA[Ptit_Dje]]></dc:creator>
				<category><![CDATA[MS SQL Server]]></category>
		<category><![CDATA[Powershell]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Le module powershell SQLPS introduit une serie de commandes powershell destinées à l&#8217;interaction avec les composants de la suite SQL Server et ce depuis SQL Server 2008. Ce module permet aussi entre autre de naviguer au travers des objets se trouvant sur les differentes instances SQL Server comme au travers de fichiers en mode console. Cela introduit des possibilités de scripting intéressantes car l&#8217;on peut profiter de la puissance de powershell pour réaliser ces scripts. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Le module powershell SQLPS introduit une serie de commandes powershell destinées à l&rsquo;interaction avec les composants de la suite SQL Server et ce depuis SQL Server 2008.<br />
Ce module permet aussi entre autre de naviguer au travers des objets se trouvant sur les differentes instances SQL Server comme au travers de fichiers en mode console.<br />
Cela introduit des possibilités de scripting intéressantes car l&rsquo;on peut profiter de la puissance de powershell pour réaliser ces scripts.<br />
<span id="more-12"></span><br />
La commande Invoke-Sqlcmd, commande qui comme son nom peut déjà vous y avoir fait penser, permet d&rsquo;invoquer des scripts tels qu&rsquo;on pourrait le faire avec l&rsquo;utilitaire Sqlcmd.<br />
Vous pourrez découvrir la description (complète) de cette commande en tapant dans une invite de commande SQLPS (ou Powershell en ayant chargé le module adéquat &#8211; sur un serveur ou Denali a été installé: <strong><code class="codecolorer text default"><span class="text">Import-Module sqlps -DisableNameChecking</span></code></strong>) :<br />
<strong><code class="codecolorer text default"><span class="text">Get-Help Invoke-Sqlcmd</span></code></strong><br />
Pour des exemples rapides:<br />
<strong><code class="codecolorer text default"><span class="text">Get-Help Invoke-Sqlcmd -Examples</span></code></strong><br />
Ou pour la documentation exhaustive:<br />
<strong><code class="codecolorer text default"><span class="text">Get-Help Invoke-Sqlcmd -Full</span></code></strong></p>
<p>Que faire avec cela ?</p>
<p>Voici 2 exemples:</p>
<p><em>Exporter le résultat d&rsquo;une query dans un fichier csv:</em></p>
<p><strong><code class="codecolorer text default"><span class="text">Invoke-Sqlcmd -ServerInstance &quot;WIN-QDRSKD4G3GP\SQL11&quot; -Database Volume -Query &quot;select * from volumetest&quot; | export-csv &quot;c:\temp\extract_ps.csv&quot;</span></code></strong><br />
Ce que j&rsquo;apprécie grandement, c&rsquo;est la simplicité d&rsquo;écriture.<br />
Ce bout de code peut être placé tel quel dans le step d&rsquo;un job de l&rsquo;agent SQL Server (de type PowerShell) et être exécuté sans problème.<br />
<img src="http://blog.developpez.com/media/invoke_sqlcmd_job.png" width="859" height="496" alt="Job" /></p>
<p>Ci-dessous un extrait du fichier généré:</p>
<blockquote><p>#TYPE System.Data.DataRow<br />
&laquo;&nbsp;id&nbsp;&raquo;,&nbsp;&raquo;UniqueID&nbsp;&raquo;<br />
&laquo;&nbsp;1&nbsp;&raquo;,&nbsp;&raquo;9ea1edd1-0163-43c8-a12c-036329425f3f&nbsp;&raquo;<br />
&laquo;&nbsp;2&nbsp;&raquo;,&nbsp;&raquo;1b30db32-bf16-4eb6-9cb5-52abfde676d9&Prime;<br />
&laquo;&nbsp;3&nbsp;&raquo;,&nbsp;&raquo;cb568ce5-a853-48f2-95a5-63b84da0e137&Prime;</p></blockquote>
<p>Vous remarquerez la première ligne, mentionnant le type de l&rsquo;objet ayant ete exporté. Cela provient de la fonction export-xml qui permet de typer les objets exportés permettant par la suite de les réimporter tout en conservant les propriétés de l&rsquo;objet source.<br />
La seconde étant le nom des colonnes de la table exportée.<br />
Et ensuite les différentes lignes exportées au format .csv.</p>
<p>Coté performances par contre il ne faut pas être pressé malheureusement!!! <img src="https://blog.developpez.com/dje/wp-includes/images/smilies/icon_sad.gif" alt=":(" class="wp-smiley" /><br />
Rien à voir avec BCP!<br />
Voici la comparaison de vitesse pour une extraction via BCP et utilisant Invoke-Sqlcmd pour un volume de plus ou moins 150Mo:<br />
<img src="http://blog.developpez.com/media/invoke_sqlcmd_vs_bcp.png" width="580" height="44" alt="" /></p>
<p>On ne l&rsquo;utilisera donc pas pour des exports massifs au quotidien si l&rsquo;on souhaite de la vitesse.<br />
Par contre pour un export one shot vite fait, si la volumétrie n&rsquo;est pas trop importante, pourquoi pas!<br />
Passons à l&rsquo;exemple suivant..</p>
<p><em>Utiliser la commande dans un script:</em></p>
<p>Dans les billets précédents, je regardais comment extraire les informations des volumes de serveurs en se servant du powershell et de WMI.<br />
Je me suis posé la question &#8211; et si la liste de serveurs provenait d&rsquo;une table ?<br />
Et voici la réponse:<br />
<strong></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Get-WmiObject win32_volume -Filter &quot;drivetype=3&quot; -computername (Invoke-Sqlcmd -ServerInstance .\SQL11 -Query &quot;select name from volume.dbo.servername&quot; | foreach {$_.name}) ` <br />
| Add-Member -MemberType ScriptProperty -Name FreeSpaceinGB -Value {[math]::Round(($this.freespace / 1GB),2)} -PassThru ` <br />
| Add-Member -MemberType ScriptProperty -Name UsedSpaceinGB -Value {[math]::Round((($this.capacity - $this.freespace) / 1GB),2)} -PassThru ` <br />
| Add-Member -MemberType ScriptProperty -Name SizeinGB -Value {[math]::Round(($this.capacity / 1GB),2)} -PassThru ` <br />
| Add-Member -MemberType ScriptProperty -Name FreespacePercent -Value {[math]::Round(([int64]$this.freespace / [int64]$this.capacity * 100),2)} -PassThru ` <br />
| select __SERVER, Name, FreespaceinGB, UsedSpaceinGB, SizeinGB, FreespacePercent, BlockSize ` <br />
| export-csv &quot;C:\Powershell\Disks\list.csv&quot;</div></div>
<p></strong></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Remonter les informations de capacité des disques avec Powershell (partie 2)</title>
		<link>https://blog.developpez.com/dje/p10628/ms-sql-server/remonter_les_informations_de_capacite_de_2</link>
		<comments>https://blog.developpez.com/dje/p10628/ms-sql-server/remonter_les_informations_de_capacite_de_2#comments</comments>
		<pubDate>Tue, 03 Jan 2012 19:21:41 +0000</pubDate>
		<dc:creator><![CDATA[Ptit_Dje]]></dc:creator>
				<category><![CDATA[MS SQL Server]]></category>
		<category><![CDATA[Powershell]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Suite à l&#8217;article précédent, j&#8217;ai continué mes recherches, spécialement pour pouvoir bénéficier de la commande export-csv&#8230; Au passage, ajout de propriétés calculées et chargement direct du fichier d&#8217;input, ce qui permet d&#8217;écrire le script en une seule ligne (je l&#8217;ai splitée par question de lisibilité&#8230;): #CSV format based on server list file Get-WmiObject win32_volume -Filter &#34;drivetype=3&#34; -computername @(get-content &#34;C:\Powershell\Disks\ServerList.txt&#34;) ` &#124; Add-Member -MemberType ScriptProperty -Name FreeSpaceinGB -Value {[math]::Round(($this.freespace / 1GB),2)} -PassThru ` &#124; Add-Member -MemberType [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Suite à l&rsquo;article précédent, j&rsquo;ai continué mes recherches, spécialement pour pouvoir bénéficier de la commande export-csv&#8230;<br />
Au passage, ajout de propriétés calculées et chargement direct du fichier d&rsquo;input, ce qui permet d&rsquo;écrire le script en une seule ligne (je l&rsquo;ai splitée par question de lisibilité&#8230;):</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">#CSV format based on server list file <br />
Get-WmiObject win32_volume -Filter &quot;drivetype=3&quot; -computername @(get-content &quot;C:\Powershell\Disks\ServerList.txt&quot;) ` <br />
| Add-Member -MemberType ScriptProperty -Name FreeSpaceinGB -Value {[math]::Round(($this.freespace / 1GB),2)} -PassThru ` <br />
| Add-Member -MemberType ScriptProperty -Name UsedSpaceinGB -Value {[math]::Round((($this.capacity - $this.freespace) / 1GB),2)} -PassThru ` <br />
| Add-Member -MemberType ScriptProperty -Name SizeinGB -Value {[math]::Round(($this.capacity / 1GB),2)} -PassThru ` <br />
| Add-Member -MemberType ScriptProperty -Name FreespacePercent -Value {[math]::Round(([int64]$this.freespace / [int64]$this.capacity * 100),2)} -PassThru ` <br />
| select __SERVER, Name, FreespaceinGB, UsedSpaceinGB, SizeinGB, FreespacePercent, BlockSize ` <br />
| export-csv &quot;C:\Powershell\Disks\list.csv&quot;</div></div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
