tag:linuxfr.org,2005:/tags/powershell/publicLinuxFr.org : les contenus étiquetés avec « powershell »2017-07-18T09:31:05+02:00/favicon.pngtag:linuxfr.org,2005:Post/383022017-07-15T15:37:20+02:002017-07-15T15:37:20+02:00Exploiter retour commande<p>Bonjour,</p>
<p>Je cherche à exploiter les retours de commande de façon simple mais je n'arrive pas à faire ce que je fais très facilement en PowerShell sous Windows. Je m'explique :</p>
<p>En Powershell je tape ceci :</p>
<pre><code class="powershell"><span class="n">PS</span> <span class="n">C</span><span class="err">:</span><span class="p">\</span><span class="n">Users</span><span class="p">\</span><span class="n">user</span><span class="p">\</span><span class="n">Documents</span><span class="p">></span> <span class="nb">Get-WmiObject</span> <span class="n">win32_logicaldisk</span></code></pre>
<p>Et j'obtiens ça :</p>
<pre><code class="powershell"><span class="n">DeviceID</span> <span class="err">:</span> <span class="n">C</span><span class="err">:</span>
<span class="n">DriveType</span> <span class="err">:</span> <span class="n">3</span>
<span class="n">ProviderName</span> <span class="err">:</span>
<span class="n">FreeSpace</span> <span class="err">:</span> <span class="n">43717443584</span>
<span class="n">Size</span> <span class="err">:</span> <span class="n">107164463104</span>
<span class="n">VolumeName</span> <span class="err">:</span>
<span class="n">DeviceID</span> <span class="err">:</span> <span class="n">D</span><span class="err">:</span>
<span class="n">DriveType</span> <span class="err">:</span> <span class="n">3</span>
<span class="n">ProviderName</span> <span class="err">:</span>
<span class="n">FreeSpace</span> <span class="err">:</span> <span class="n">350521815040</span>
<span class="n">Size</span> <span class="err">:</span> <span class="n">578196054016</span>
<span class="n">VolumeName</span> <span class="err">:</span> <span class="n">DONNEES</span>
<span class="n">DeviceID</span> <span class="err">:</span> <span class="n">E</span><span class="err">:</span>
<span class="n">DriveType</span> <span class="err">:</span> <span class="n">3</span>
<span class="n">ProviderName</span> <span class="err">:</span>
<span class="n">FreeSpace</span> <span class="err">:</span> <span class="n">35703640064</span>
<span class="n">Size</span> <span class="err">:</span> <span class="n">64419262464</span>
<span class="n">VolumeName</span> <span class="err">:</span> <span class="n">BETA</span></code></pre>
<p>Mais si je tape ceci :</p>
<pre><code class="powershell"><span class="n">PS</span> <span class="n">C</span><span class="err">:</span><span class="p">\</span><span class="n">Users</span><span class="p">\</span><span class="n">thoma</span><span class="p">\</span><span class="n">Documents</span><span class="p">></span> <span class="p">$(</span><span class="nb">Get-WmiObject</span> <span class="n">win32_logicaldisk</span><span class="p">).</span><span class="n">DeviceID</span></code></pre>
<p>J'obtiens directement ça :</p>
<pre><code class="powershell"><span class="n">C</span><span class="err">:</span>
<span class="n">D</span><span class="err">:</span>
<span class="n">E</span><span class="err">:</span></code></pre>
<p>J'aimerais donc faire la même chose avec cette commande sous Linux en ne prenant par exemple que la colonne Name :</p>
<pre><code>root@debian:/home/user# lsblk -d -e 11
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 8G 0 disk
sdb 8:16 0 15G 0 disk
sdc 8:32 0 10G 0 disk
sdd 8:48 0 5G 0 disk
</code></pre>
<p>Est-ce possible sans passer par des grep, awk, sed et j'en passe ? Si oui je suis preneur de la méthode.</p>
<p>Merci d'avance.</p><div><a href="https://linuxfr.org/forums/programmation-shell/posts/exploiter-retour-commande.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/112299/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/programmation-shell/posts/exploiter-retour-commande#comments">ouvrir dans le navigateur</a>
</p>
ptit_poulethttps://linuxfr.org/nodes/112299/comments.atomtag:linuxfr.org,2005:Diary/367792016-08-19T10:16:08+02:002016-08-19T10:16:08+02:00Microsoft: Powershell libéréLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p><a href="https://github.com/PowerShell/PowerShell/">https://github.com/PowerShell/PowerShell/</a></p>
<p>PowerShell intègre un interface en ligne de commande, le langage de script PowerShell ainsi qu'un kit de développement. Il est inclus depuis Windows 7 et s'appuie sur le framework Microsoft .NET.</p>
<p>Après avoir libéré le Framework .NET, Microsoft vient de faire la même chose pour son Shell en le rendant disponible sous Linux et OSX.</p>
<p>Pas pu tester pour le moment car il ne fonctionne pas sous ArchLinux. Mais je suis curieux de voir comment Microsoft va intégrer cela avec notre OS. En effet, Powershell se base sur des couches d'abstractions pour communiquer avec le système, lui permettant de renvoyer des données formatées et donc d'éviter certaines galères communes aux Shell Unix comme:</p>
<pre><code>$ ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/'
</code></pre>
<p>vs</p>
<pre><code>>Get-NetIPAddress –AddressFamily IPv4
</code></pre>
<p>Merci de ne pas poster votre version plus courte pour obtenir l'ip courante, j'ai juste copié collé le premier résultat depuis Google</p>
<p>Bref, à suivre.</p><div><a href="https://linuxfr.org/users/gnumdk/journaux/microsoft-powershell-libere.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/109810/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/gnumdk/journaux/microsoft-powershell-libere#comments">ouvrir dans le navigateur</a>
</p>
gnumdkhttps://linuxfr.org/nodes/109810/comments.atomtag:linuxfr.org,2005:Diary/367782016-08-19T10:04:03+02:002016-08-19T10:04:03+02:00PowerShell sur LinuxLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p>Bizarre,</p>
<p>Personne ne s'y est collé, alors je fais suivre la nouvelle pour ceux qui sont vraiment en vacances :-)<br><strong>PowerShell devient Open Source (Licence MIT) et est disponible pour Linux</strong>. Les sources sont disponibles sur GitHub, et des paquets sont proposés pour les dernières distributions Ubuntu et Centos. Microsoft poursuit donc sa politique d'ouverture du code sur des produits phares de son catalogue.</p>
<p>Quelques liens :</p>
<ul>
<li><a href="https://azure.microsoft.com/en-us/blog/powershell-is-open-sourced-and-is-available-on-linux/">L'annonce officielle</a></li>
<li><a href="https://github.com/PowerShell/PowerShell/tree/master/docs/learning-powershell">La page GitHub</a></li>
<li><a href="https://github.com/PowerShell/PowerShell/blob/master/docs/installation/linux.md">Instruction d'installation sur Linux</a></li>
</ul><p>Jusqu'où ira Microsoft avec Linux ? La société va-t-elle devenir multi OS ? Peut-on imaginer un Windows 30 sur un noyau Linux :-) ?</p><div><a href="https://linuxfr.org/users/dcp/journaux/powershell-sur-linux.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/109809/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/dcp/journaux/powershell-sur-linux#comments">ouvrir dans le navigateur</a>
</p>
dcphttps://linuxfr.org/nodes/109809/comments.atomtag:linuxfr.org,2005:Diary/359132015-06-05T08:54:03+02:002015-06-05T10:04:13+02:0020 ans pour SSHLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p>On est vendredi, c'est permis :)<br>
Incroyable, pour les 20 ans du SSH, M$ vient de prendre l'initiative de supporter ce protocole:<br><a href="http://blogs.msdn.com/b/powershell/archive/2015/06/03/looking-forward-microsoft-support-for-secure-shell-ssh.aspx">http://blogs.msdn.com/b/powershell/archive/2015/06/03/looking-forward-microsoft-support-for-secure-shell-ssh.aspx</a></p>
<p>Et un petit lien, pour plus d'information:<br><a href="http://fr.wikipedia.org/wiki/Secure_Shell">http://fr.wikipedia.org/wiki/Secure_Shell</a></p><div><a href="https://linuxfr.org/users/skeespin/journaux/20-ans-pour-ssh.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/105968/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/skeespin/journaux/20-ans-pour-ssh#comments">ouvrir dans le navigateur</a>
</p>
skeespinhttps://linuxfr.org/nodes/105968/comments.atomtag:linuxfr.org,2005:Diary/340752013-07-03T15:03:26+02:002013-07-03T15:03:26+02:00Lister les programmes installés sur un (ou plusieurs) poste(s) sous Windows (XP ou 7)Licence CC By‑SA http://creativecommons.org/licenses/by-sa/3.0/deed.fr<h4 id="introduction">Introduction</h4>
<p>Le PowerShell vous devez grave kiffer ça ici ! Nan j'déconne… Mais voilà, moi j'apprends. Alors d'une part je voudrais bien connaître votre avis sur ce langage et d'autre part vous faire partager un petit script (c'est mon deuxième script en PowerShell !), ça pourrait servir à quelqu'un, qui sait…</p>
<h4 id="la-demande">La demande</h4>
<p>Connaître la liste des programmes installés sur plusieurs postes de notre parc (je précise que je ne suis pas moi-même à la gestion de parc) qui tournent sous Windows.</p>
<h4 id="ma-motivation">Ma motivation</h4>
<p>Cette demande a en fait été adressée à l'un de mes collègues. Il n'aime pas trop demander de l'aide et il a l'air plutôt fier qu'on lui ait confié cette mission. Quand je l'ai vu faire des copies d'écran de la fenêtre de dialogue « Programmes et fonctionnalités » du panneau de configuration et ouvrir un tableur Excel j'ai retenu un <em>face palm</em>, j'ai fermé ma gueule et je me suis demandé comment faire cela de manière plus automatique. La demande ne concernant que 5 postes je me suis dit que je pouvais le laisser se débrouiller, ça l'a bien occupé…</p>
<h4 id="les-solutions-existantes">Les solutions existantes</h4>
<p>Et bien en fait il n'y a pas vraiment de solution rapide et élégante, genre un <code>dpkg -l |grep ^ii |grep -v "^ii lib"</code> mais ça je m'en doutais, on est sous Windows après tout… Il y a bien la ligne de commande suivante :</p>
<pre><code>wmic product get name,version
</code></pre>
<p>C'est sexy comme commande ?! Non ? Moi je trouve que si. Bon… </p>
<p>Ça peut même nous cracher une liste en HTML mais malheureusement ça ne liste que les programmes installés à l'aide d'un package MSI.</p>
<p>Après une recherche sur le web il apparaît que la meilleure méthode est d'aller lire deux clés dans le registre, allons y gaiment !</p>
<h4 id="mon-script">Mon script</h4>
<pre><code class="powershell"><span class="nv">$ErrorActionPreference</span><span class="p">=</span> <span class="s1">'silentlycontinue'</span>
<span class="k">if</span> <span class="p">(</span><span class="nv">$Args</span><span class="p">)</span> <span class="p">{</span> <span class="nv">$Computer</span> <span class="p">=</span> <span class="nv">$Args</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="nv">$Computer</span> <span class="p">=</span> <span class="s2">"hostname1"</span><span class="p">,</span><span class="s2">"hostname2"</span> <span class="p">}</span>
<span class="k">function</span> <span class="n">list_reg_to_csv</span> <span class="p">(</span><span class="nv">$C</span><span class="p">,</span><span class="nv">$RG</span><span class="p">)</span>
<span class="p">{</span>
<span class="nv">$myobjs</span> <span class="p">=</span> <span class="err">@</span><span class="p">()</span>
<span class="nv">$RemoteRegistry</span> <span class="p">=</span> <span class="no">[Microsoft.Win32.RegistryKey]</span><span class="err">::</span><span class="n">OpenRemoteBaseKey</span><span class="p">(</span><span class="s2">"LocalMachine"</span><span class="p">,</span><span class="nv">$C</span><span class="p">)</span>
<span class="nv">$RegKey</span> <span class="p">=</span> <span class="nv">$RemoteRegistry</span><span class="p">.</span><span class="n">OpenSubKey</span><span class="p">(</span><span class="nv">$RG</span><span class="p">)</span>
<span class="k">foreach</span><span class="p">(</span><span class="nv">$key</span> <span class="k">in</span> <span class="nv">$RegKey</span><span class="p">.</span><span class="n">GetSubKeyNames</span><span class="p">())</span>
<span class="p">{</span>
<span class="nv">$SubKey</span> <span class="p">=</span> <span class="nv">$RegKey</span><span class="p">.</span><span class="n">OpenSubKey</span><span class="p">(</span><span class="nv">$key</span><span class="p">)</span>
<span class="nv">$myobj</span> <span class="p">=</span> <span class="s2">""</span> <span class="p">|</span> <span class="nb">Select-Object</span> <span class="n">DisplayName</span><span class="p">,</span><span class="n">Version</span><span class="p">,</span><span class="n">Publisher</span><span class="p">,</span><span class="n">InstallLocation</span><span class="p">,</span><span class="n">InstallDate</span><span class="p">,</span><span class="n">InstallSource</span><span class="p">,</span><span class="n">EstimatedSize</span><span class="p">,</span><span class="n">URLInfoAbout</span><span class="p">,</span><span class="n">Contact</span><span class="p">,</span><span class="n">Comments</span>
<span class="nv">$myobj</span><span class="p">.</span><span class="n">DisplayName</span> <span class="p">=</span> <span class="nv">$SubKey</span><span class="p">.</span><span class="n">GetValue</span><span class="p">(</span><span class="s2">"DisplayName"</span><span class="p">)</span>
<span class="nv">$myobj</span><span class="p">.</span><span class="n">Version</span> <span class="p">=</span> <span class="nv">$SubKey</span><span class="p">.</span><span class="n">GetValue</span><span class="p">(</span><span class="s2">"DisplayVersion"</span><span class="p">)</span>
<span class="nv">$myobj</span><span class="p">.</span><span class="n">Publisher</span> <span class="p">=</span> <span class="nv">$SubKey</span><span class="p">.</span><span class="n">GetValue</span><span class="p">(</span><span class="s2">"Publisher"</span><span class="p">)</span>
<span class="nv">$myobj</span><span class="p">.</span><span class="n">InstallLocation</span> <span class="p">=</span> <span class="nv">$SubKey</span><span class="p">.</span><span class="n">GetValue</span><span class="p">(</span><span class="s2">"InstallLocation"</span><span class="p">)</span>
<span class="nv">$myobj</span><span class="p">.</span><span class="n">InstallDate</span> <span class="p">=</span> <span class="nv">$SubKey</span><span class="p">.</span><span class="n">GetValue</span><span class="p">(</span><span class="s2">"InstallDate"</span><span class="p">)</span>
<span class="nv">$myobj</span><span class="p">.</span><span class="n">InstallSource</span> <span class="p">=</span> <span class="nv">$SubKey</span><span class="p">.</span><span class="n">GetValue</span><span class="p">(</span><span class="s2">"InstallSource"</span><span class="p">)</span>
<span class="nv">$myobj</span><span class="p">.</span><span class="n">EstimatedSize</span> <span class="p">=</span> <span class="nv">$SubKey</span><span class="p">.</span><span class="n">GetValue</span><span class="p">(</span><span class="s2">"EstimatedSize"</span><span class="p">)</span>
<span class="nv">$myobj</span><span class="p">.</span><span class="n">URLInfoAbout</span> <span class="p">=</span> <span class="nv">$SubKey</span><span class="p">.</span><span class="n">GetValue</span><span class="p">(</span><span class="s2">"URLInfoAbout"</span><span class="p">)</span>
<span class="nv">$myobj</span><span class="p">.</span><span class="n">Contact</span> <span class="p">=</span> <span class="nv">$SubKey</span><span class="p">.</span><span class="n">GetValue</span><span class="p">(</span><span class="s2">"Contact"</span><span class="p">)</span>
<span class="nv">$myobj</span><span class="p">.</span><span class="n">Comments</span> <span class="p">=</span> <span class="nv">$SubKey</span><span class="p">.</span><span class="n">GetValue</span><span class="p">(</span><span class="s2">"Comments"</span><span class="p">)</span>
<span class="nv">$myobjs</span> <span class="p">+=</span> <span class="nv">$myobj</span>
<span class="p">}</span>
<span class="k">return</span> <span class="nv">$myobjs</span>
<span class="p">}</span>
<span class="k">foreach</span> <span class="p">(</span><span class="nv">$H</span> <span class="k">in</span> <span class="nv">$Computer</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="o">-Not</span> <span class="p">(</span><span class="nb">Test-Connection</span> <span class="n">-quiet</span> <span class="nv">$H</span><span class="p">))</span>
<span class="p">{</span>
<span class="n">echo</span> <span class="s2">"Host $H is down."</span>
<span class="k">continue</span>
<span class="p">}</span>
<span class="k">else</span>
<span class="p">{</span>
<span class="n">echo</span> <span class="s2">"Getting list of installed software products on host $H"</span>
<span class="nv">$output</span> <span class="p">=</span> <span class="err">@</span><span class="p">()</span>
<span class="nv">$output</span> <span class="p">+=</span> <span class="n">list_reg_to_csv</span> <span class="nv">$H</span> <span class="s2">"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"</span>
<span class="nv">$output</span> <span class="p">+=</span> <span class="n">list_reg_to_csv</span> <span class="nv">$H</span> <span class="s2">"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"</span>
<span class="c"># $date = date -format yyyyMMdd-hhmm</span>
<span class="nv">$filename</span> <span class="p">=</span> <span class="nv">$H</span><span class="p">+</span><span class="s2">".csv"</span>
<span class="nv">$output</span> <span class="p">|</span> <span class="nb">Export-Csv</span> <span class="n">-NoTypeInformation</span> <span class="n">-encoding</span> <span class="n">Unicode</span> <span class="n">-Delimiter</span> <span class="s2">";"</span> <span class="nv">$filename</span>
<span class="p">}</span>
<span class="p">}</span></code></pre>
<p>Le script s'utilise ainsi : <code>softlist.ps1 [ <hostname1>, <hostname2>, … ]</code> et il génère un fichier CSV par machine dans le répertoire depuis lequel il est lancé. Si on n'indique pas d'hôte ce sont une paire d'hôtes codés en dur qui sont utilisés.</p>
<p>Alors des fois, bien que l'hôte soit UP ça ne fonctionne pas (accès refusé), il faut encore virer les lignes vides (correspondant à des clés vides, des programmes qui ne sont manifestement plus installés mais qui laissent des traces dans le registre, ça se fait bien en virant les doublons dans Excel) mais dans l'ensemble c'est assez pratique. Et si un jour on nous demande de le faire sur d'autre postes j'ai un truc à proposer.</p>
<p>Peut-être que d'autre ici sauront me proposer une meilleure solution ou des améliorations possibles.</p>
<p>Merci pour votre attention.</p>
<p>PS : Je comptais poster dans le forum mais en fait non, je fais un nourjal tiens !</p><div><a href="https://linuxfr.org/users/m4rotte/journaux/lister-les-programmes-installes-sur-un-ou-plusieurs-poste-s-sous-windows-xp-ou-7.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/98961/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/m4rotte/journaux/lister-les-programmes-installes-sur-un-ou-plusieurs-poste-s-sous-windows-xp-ou-7#comments">ouvrir dans le navigateur</a>
</p>
Marotte ⛧https://linuxfr.org/nodes/98961/comments.atom