Database
 sql >> Base de données >  >> RDS >> Database

Parce que vous devez connaître PowerShell

Hey - j'espère que tu vas bien.

Je veux prendre quelques minutes pour vous aider à démarrer avec PowerShell, d'une manière qui, à mon avis, est moins écrasante que la façon dont j'ai trouvé la plupart du matériel PowerShell à l'époque. Parce que vous m'avez dit que vous entendiez parler de PowerShell et que vous ne savez pas comment vous y prendre.

La première chose à savoir est que cela ressemble à une invite de commande sur les stéroïdes, mais beaucoup plus utile que l'invite de commande. Vous verrez ce que je veux dire dès que vous l'ouvrirez. Faisons cela, mais ouvrons-le en utilisant "Exécuter en tant qu'administrateur", car cela aide simplement pour certaines démos. Dans la vraie vie, vous ne l'ouvrirez avec les droits d'administrateur que si vous en avez vraiment besoin.

Cliquez donc sur le bouton de démarrage et commencez à taper PowerShell. Je ne veux pas (encore) que vous ouvriez l'ISE, trouvez simplement le raccourci "Windows PowerShell" et faites un clic droit dessus pour choisir "Exécuter en tant qu'administrateur".

Maintenant qu'il est en cours d'exécution, épinglez-le à votre barre des tâches afin de pouvoir y accéder plus rapidement la prochaine fois. Si vous essayez d'adopter PowerShell, vous devez le rendre facile à ouvrir.

Quoi qu'il en soit, cette fenêtre… tout de suite, on a l'impression que vous devez avoir une idée de ce qu'il faut écrire. Oui c'est vrai. Les choses auraient peut-être été un peu plus faciles dans l'ISE, et Aaron Nelson (@sqlvariant) m'a reproché de ne pas utiliser l'ISE à chaque fois que je fais quoi que ce soit dans PowerShell, mais tout ira bien ici.

Commençons par faire quelques choses de base que nous connaissons du DOS. Les commandes cd et dir . Essayez ceci :

cd ..
dir

Vous verrez que vous vous déplacez jusqu'à C:\WINDOWS , puis répertoriez le contenu. Pas de surprises ici, c'est comme l'invite de commande. Ou DOS si vous êtes assez vieux.

La différence avec PowerShell est qu'il ne s'agit pas seulement d'une sortie de texte. Ces choses sont des objets . Et on peut faire des trucs avec ça. PowerShell est un environnement "typé". Vous traitez déjà tout le temps avec des objets, comme dans l'Explorateur d'objets de SSMS. Les objets PowerShell peuvent inclure toutes ces choses, ainsi que des objets .Net. C'est de là que PowerShell tire sa puissance.

Quelques petites choses rapides…

  1. Les commandes PowerShell sont fournies par paires verbe-nom, telles que Set-Location ou Get-Content ou Get-ChildItem . Celles-ci sont connues sous le nom d'applets de commande, donc lorsque vous voyez le mot "applet de commande", cela signifie simplement une commande PowerShell.
  2. Les paramètres de commande PowerShell utilisent un trait d'union. Comme :Get-ChildItem -Recurse mais vous pouvez aussi les abréger tant qu'il n'y a pas d'ambiguïté. Donc je pourrais utiliser -rec au lieu de -recurse .
  3. Les variables commencent par un signe dollar ($ ). Nous y reviendrons plus tard.
  4. Nous n'utilisons pas > dans les filtres et les tests, nous utilisons -gt . -eq pour = , -ne pour != /<> , -le pour <= , etc. C'est frustrant, mais vous vous y habituerez.
  5. Il existe un tas d'abréviations et d'alias. Un alias pour Set-Location est cd . Get-ChildItem est également connu sous le nom de dir , et ls aussi. Where-Object est ? et ForEach-Object est % . Nous les verrons aussi au fur et à mesure.
  6. Vous obtenez la complétion par tabulation sur presque tout, donc si vous avez tapé Get-Chi , vous pouvez appuyer sur Tab et faire défiler les options jusqu'à ce que vous trouviez ce que vous voulez.
  7. Vous pouvez utiliser help (qui est un alias pour Get-Help ) en utilisant simplement :help dir , et au bas de cette aide, vous aurez un joli rappel que vous auriez pu utiliser help dir -examples , et qu'en ajoutant -online aurait ouvert une page Web avec la page d'aide correspondante (c'est vraiment pratique).
  8. Vous pouvez passer les résultats d'une chose à une autre en utilisant le symbole pipe (| ). Le plus utile est peut-être gm (un alias pour Get-Member ), qui répertorie les propriétés et les méthodes (les membres) pour tout objet que vous avez transmis.
  9. # commentera la ligne, ou ira entre <# et #>

Voyons une partie de cela en action.

Ici, nous pouvons voir des choses intéressantes. Bon à noter que nous pourrions utiliser -Exclude et -Include . Nous le ferons bientôt. Nous pourrions obtenir plus d'informations en utilisant -detailed , ou -examples , ou -full .

Explorons notre dossier SQL. Commencez par taper cd \p puis appuyez sur Tab jusqu'à ce qu'il vous montre Program Files.

Maintenant, appuyez sur M et recommencez à appuyer sur Tab pour trouver « Microsoft SQL Server ». Si vous allez trop loin, appuyez sur Maj-Tab pour revenir en arrière. (Oh, et si vous auriez dû chercher sur D: , puis recommencez avec cd D:\p – mais les principes sont les mêmes.)

Génial. Appuyons sur Entrée et voyons que nous avons changé de répertoire.

Mais maintenant tapons :dir -rec -inc ConfigurationFile.ini

Vous auriez pu appuyer sur Tab après chaque paramètre et les voir se développer dans les versions les plus correctes. Vous auriez pu utiliser Get-ChildItem être un peu plus strict. Je ne m'en soucie pas vraiment. Lorsque vous exécutez ceci, vous verrez certains fichiers répertoriés. Je ne sais pas combien tu en auras. Chacun indique que vous avez exécuté une installation de SQL Server. Mais en tant qu'expert SQL, vous le savez. Vous ne saviez peut-être pas avec quelle facilité PowerShell pouvait les répertorier pour vous.

D'accord. Espérons que nous voyons une certaine utilité pour cela.

Faisons maintenant quelque chose avec cette sortie. Je veux dire "avec ces fichiers", mais faisons le truc des données et considérons cela comme un ensemble de données de fichiers.

Supposons que nous voulions les compter. Je pourrais parcourir les résultats en utilisant ForEach-Object (mais je vais utiliser le raccourci % ) et incrémentez une variable que j'ai configurée. Il s'agit d'un modèle courant de boucle - les gens placent des programmes entiers entre ces accolades, sur de nombreuses lignes.

Cela fait l'affaire, mais je suis sûr qu'il y a quelque chose d'intégré pour me permettre de compter les choses.

Eh bien, je ne me souviens jamais de ce que cette commande, alors demandons à l'un de ces fournisseurs de recherche Internet sophistiqués.

Je ne veux même pas ouvrir ces pages. Je veux juste remarquer qu'il y a une commande appelée Measure-Object . Canalisons notre sortie là-dedans. Appuyez sur la touche "flèche vers le haut" pour revenir à une commande précédente.

Cela prend un moment, puis nous dit joyeusement qu'il y en a trois.

Cela prend un moment car il faut à nouveau rechercher dans les fichiers. Et si on stockait ces résultats quelque part ?

Maintenant, j'appelle ces choses des parenthèses, mais les Américains les appellent des parenthèses. Et ce que vous appelez crochets, je l'appelle crochets. Il y a aussi des accolades, que vous appelez des accolades je pense. Je vais essayer d'appeler les parenthèses « crochets » pour éviter toute confusion, mais si je me réfère à un « crochet », je veux dire une parenthèse.

Je vais envelopper mon dir commande entre parenthèses et affectez-la à une variable.

Maintenant, je peux diriger $configfilelist dans Measure-Object et il sera plus réactif, car j'ai stocké mes résultats.

Mais parce que $configfilelist est un tableau de fichiers, je peux aussi regarder sa longueur pour voir qu'il y a trois éléments. C'est beaucoup plus facile. Et je peux accéder à chacun en utilisant des crochets de 0 à 2.

Ce n'est pas encore vraiment révolutionnaire. Mais ces fichiers nous disent des choses utiles. Faisons un Get-Member commande sur notre tableau.

Ne vous laissez pas rebuter par cela. En haut, nous pouvons voir que nous avons affaire à des objets de type System.IO.FileInfo . C'est une chose .Net et c'est de là que vient le pouvoir. Nous pouvons voir que nous pourrions appeler le Delete méthodes de ces fichiers, ou CopyTo , ou Decrypt (s'ils étaient cryptés, mais ils ne le sont pas), et plus encore. En bas, nous voyons Propriétés.

C'est plus intéressant. Regardons LastWriteTime . Parce que nous pourrions être intéressés de savoir quand c'est.

Nous pouvons utiliser Select-Object pour ne montrer que certaines propriétés.

Comme prévu, rien n'est écrit dans ces fichiers depuis que les installations ont été réellement effectuées. Mais que se passe-t-il si je veux filtrer cela, uniquement à ceux depuis un moment donné ?

Je vais utiliser Get-Date pour obtenir la date et l'heure actuelles. Je vais envelopper cela entre parenthèses et utiliser son AddYears méthode à trouver il y a un an. Dans le monde réel, je serais plus enclin à utiliser AddDays , mais je veux obtenir des résultats.

Et je vais filtrer $configfilelist en passant dans Where-Object (sauf que je vais utiliser un raccourci pratique qui est le point d'interrogation). Mon filtre vit à l'intérieur d'accolades (« accolades », n'est-ce pas ?), et à l'intérieur de ces accolades, je fais référence aux choses dans $configfilelist en utilisant $_ .

Donc mon filtre va comme ça, disant que je veux lister ceux qui ont un LastWriteTime supérieur à (-gt ) il y a un an :

Et je ne reçois qu'un seul fichier. Formidable.

C'est bien beau, mais maintenant je veux savoir en quoi consistait cette installation. Pour cela, nous devons regarder à l'intérieur du fichier. Get-Content est notre ami ici. Commençons par utiliser Get-Content contre un fichier directement. Il sera facile de l'accrocher à notre commande appropriée plus tard.

Get-Content renvoie en fait un tableau de lignes et a des paramètres vraiment utiles comme -TotalCount qui s'arrête après un certain nombre de lignes, ou -Tail qui obtient des lignes à la fin du fichier. J'aime ça quand je traite des fichiers volumineux - ce n'est pas comme si je pouvais les ouvrir dans le Bloc-notes.

Laissez-moi vous parler de Select-String aussi. C'est comme grep d'Unix - vous l'utilisez pour obtenir les lignes que vous voulez dans un fichier.

Cette sortie semble pénible, mais rappelez-vous qu'il ne s'agit que de la représentation sous forme de chaîne d'un objet. Si je dirige ma commande vers gm (Get-Member ), vous verrez ce que je veux dire.

Alors maintenant, je peux dire que je peux accéder au Path du fichier, la Line , le LineNumber , etc., séparément.

Pour rechercher plusieurs choses, je veux passer un tableau de paramètres à -Pattern . Je le fais en utilisant simplement une virgule, pour découvrir qu'il s'agissait d'une installation d'Analysis Services.

J'espère que vous commencez à voir la puissance de cela.

Je peux tout déposer sur une seule ligne en utilisant :

dir -rec -inc ConfigurationFile.ini | ? {$_.LastWriteTime -gt (Get-Date).AddYears(-1)} | select-string -Pattern 'FEATURES=','ACTION=' | select-object Path, Line

(Désolé, vous devrez probablement faire défiler les pages latéralement pour voir tout cela - tout mettre sur une seule ligne n'est pas exactement une vertu en HTML.)

Lorsque vous travaillez sur des choses que vous aimez, vous voudrez stocker les commandes quelque part pour plus tard (comme dans un fichier .ps1 que vous exécutez). Pour cela, vous voulez être au courant de Get-History . Il répertorie tout ce que vous avez exécuté au cours de cette session.

Et une petite astuce intéressante est que vous pouvez utiliser des nombres négatifs pour vous connecter à des tableaux à partir de l'autre extrémité. Vous pouvez donc faire ceci :

Mais au lieu de simplement l'afficher, dirigez-le vers clip :

… qui le met dans le presse-papiers.

Je ne vais pas aller beaucoup plus loin avec cela, mais vous pouvez continuer à pousser cela de plus en plus loin vous-même, en explorant les types de choses qui pourraient être intéressantes dans votre travail. Vous pouvez vider les résultats dans des fichiers en utilisant > et ajouter aux fichiers en utilisant >> .

Considérons maintenant des commandes telles que :

Get-EventLog -LogName Application -After (Get-Date).AddHours(-1) -EntryType Error

… et imaginez ce que vous pourriez en faire.

Essayez de faire :Import-Module SQLServer

Ce qui vous permet alors de partir :

cd SQLSERVER:

Et parcourez l'environnement SQL comme s'il s'agissait d'un système de fichiers.

Je n'ai pas tendance à utiliser PowerShell pour explorer SQL comme ça très souvent, je dois l'admettre. Mais le fait que je puisse me donne certainement un tas d'options. Le fait que je puisse utiliser PowerShell pour créer un document Word comme ils le font sur https://learn-powershell.net/2014/12/31/beginning-with-powershell-and-word/, ou envoyer des e-mails comme décrit sur https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/send-mailmessage, ou appelez les services Web (y compris ceux d'Azure Machine Learning) comme décrit sur https://docs.microsoft .com/en-gb/powershell/module/Microsoft.PowerShell.Utility/Invoke-WebRequest signifie qu'avec un peu d'imagination, vous pouvez utiliser PowerShell pour faire à peu près tout ce que vous voulez. J'adore utiliser Invoke-SqlCommand pour extraire des données de SQL, les pousser dans Invoke-WebRequest pour obtenir des scores d'Azure ML, puis répondez en conséquence. PowerShell le rend vraiment simple.

Oh, et pour exécuter des commandes PowerShell sur d'autres machines (ce qui peut être très utile, bien sûr), une rapide "recherche sur Internet" m'a montré cette page utile :https://www.howtogeek.com/117192/how-to -run-powershell-commands-on-remote-computers/

Vous pouvez avoir une liste d'ordinateurs dans un fichier et la parcourir en boucle comme ceci :

Essayez des trucs. Assommez-vous. Et explorez ce que tout le monde écrit pour T-SQL mardi ce mois-ci, hébergé par Rob Sewell (@sqldbawithbeard)

@rob_farley