sql >> Base de Datos >  >> RDS >> Database

Porque necesitas saber PowerShell

Oye, espero que estés bien.

Quiero tomarme unos minutos para que comience con PowerShell, de una manera que creo que es menos abrumadora que la forma en que encontré la mayoría del material de PowerShell en el pasado. Porque me ha dicho que sigue oyendo hablar de PowerShell y que no sabe cómo acceder a él.

Lo primero que debe saber es que se siente como el Símbolo del sistema con esteroides, pero mucho más útil que el Símbolo del sistema. Verás lo que quiero decir tan pronto como lo abras. Hagámoslo, pero abrámoslo usando 'Ejecutar como administrador', porque eso solo ayuda para algunas de las demostraciones. En la vida real, solo lo abrirá con derechos de administrador si realmente lo necesita.

Así que haga clic en el botón de inicio y comience a escribir PowerShell. No quiero que abra el ISE (todavía), solo busque el acceso directo "Windows PowerShell" y haga clic con el botón derecho en él para elegir "Ejecutar como administrador".

Ahora que se está ejecutando, fíjelo en su barra de tareas para que pueda acceder a él más rápidamente la próxima vez. Si va a intentar adoptar PowerShell, debe hacerlo fácil de abrir.

De todos modos, esa ventana… de inmediato parece que necesitas tener una idea de qué escribir. Sí, eso es correcto. Las cosas podrían haber sido un poco más fáciles en el ISE, y Aaron Nelson (@sqlvariant) me ha reprendido por no usar el ISE cada vez que hago algo en PowerShell, pero estaremos bien aquí.

Comencemos por hacer algunas cosas básicas que conocemos de DOS. Los comandos cd y dir . Prueba esto:

cd ..
dir

Verás que subes a C:\WINDOWS y, a continuación, enumere el contenido. No hay sorpresas aquí, es como el símbolo del sistema. O DOS si tienes la edad suficiente.

La diferencia con PowerShell es que esto no es solo salida de texto. Estas cosas son objetos . Y podemos hacer cosas con eso. PowerShell es un entorno 'escrito'. Ya trata con objetos todo el tiempo, como en Object Explorer en SSMS. Los objetos de PowerShell pueden incluir todas esas cosas, así como objetos .Net. Aquí es donde PowerShell obtiene su poder.

Algunas cosas rápidas...

  1. Los comandos de PowerShell vienen en pares de verbo-sustantivo, como Set-Location o Get-Content o Get-ChildItem . Estos se conocen como cmdlets, por lo que cuando vea la palabra "cmdlet", solo significa un comando de PowerShell.
  2. Los parámetros de comando de PowerShell usan un guión. Como:Get-ChildItem -Recurse pero también puede abreviarlos siempre que no haya ambigüedad. Entonces podría usar -rec en lugar de -recurse .
  3. Las variables comienzan con un signo de dólar ($ ). Llegaremos a esto más tarde.
  4. No usamos > en filtros y pruebas, usamos -gt . -eq para = , -ne para != /<> , -le para <= , y así. Esto es frustrante, pero te acostumbrarás.
  5. Hay un montón de abreviaturas y alias. Un alias para Set-Location es cd . Get-ChildItem también se conoce como dir y ls también. Where-Object es ? y ForEach-Object es % . Los veremos a medida que avancemos también.
  6. Obtienes tabulación para completar casi todo, así que si has escrito Get-Chi , puede presionar Tabulador y recorrer las opciones hasta que encuentre lo que desea.
  7. Puede usar ayuda (que es un alias para Get-Help ) simplemente usando:help dir , y en la parte inferior de esa ayuda, recibirá un buen recordatorio de que podría haber usado help dir -examples , y que agregar -online habría abierto una página web con la página de ayuda correspondiente (eso es realmente útil).
  8. Puedes pasar los resultados de una cosa a otra usando el símbolo de tubería (| ). Quizás el más útil es gm (un alias para Get-Member ), que enumerará las propiedades y los métodos (los miembros) para cualquier objeto que haya pasado.
  9. # comentará la línea, o irá entre <# y #>

Veamos algo de esto en acción.

Aquí podemos ver algunas cosas interesantes. Es bueno notar que podríamos usar -Exclude y -Include . Lo haremos pronto. Podríamos obtener más información usando -detailed , o -examples , o -full .

Exploremos nuestra carpeta SQL. Comience escribiendo cd \p y luego presiona Tab hasta que te muestre Archivos de programa.

Ahora presione M y comience a presionar Tab nuevamente para encontrar 'Microsoft SQL Server'. Si va demasiado lejos, presione Shift-Tab para retroceder. (Ah, y si deberías haber estado buscando en D: , luego comience de nuevo con cd D:\p – pero los principios son los mismos.)

Estupendo. Presionemos Enter y veamos que hemos cambiado de directorio.

Pero ahora escribamos:dir -rec -inc ConfigurationFile.ini

Podrías haber presionado Tabulador después de cada parámetro y verlos expandirse a las versiones más correctas. Podrías haber usado Get-ChildItem ser un poco más estricto. Aunque realmente no me importa. Cuando ejecute esto, verá algunos archivos en la lista. no se cuantos vas a tener. Cada uno indica que ejecutó una instalación de SQL Server. Pero como experto en SQL, lo sabes. Es posible que no supiera con qué facilidad PowerShell podría enumerarlos por usted.

Está bien. Esperemos que estemos viendo algún uso para esto.

Ahora hagamos algo con esta salida. Quiero decir 'con estos archivos', pero hagamos lo de los datos y pensemos en esto como un conjunto de datos de archivos.

Supongamos que queremos contarlos. Podría recorrer los resultados usando ForEach-Object (pero usaré el atajo % ) e incrementar una variable que configuré. Este es un patrón común para los bucles:las personas colocan programas completos dentro de esos corchetes, en muchas líneas.

Esto funciona, pero estoy seguro de que hay algo integrado que me permite contar cosas.

Bueno, nunca puedo recordar cuál es ese comando, así que preguntemos a uno de esos sofisticados proveedores de búsqueda en Internet.

Ni siquiera quiero abrir estas páginas. Solo quiero notar que hay un comando llamado Measure-Object . Canalicemos nuestra salida en eso. Presiona la tecla 'flecha arriba' para volver a un comando anterior.

Esto toma un momento y luego felizmente nos dice que hay tres.

Toma un momento porque tiene que buscar entre los archivos nuevamente. ¿Qué tal si almacenamos esos resultados en algún lugar?

Ahora, yo llamo a estas cosas corchetes, pero los estadounidenses las llaman paréntesis. Y lo que llamas corchetes, yo lo llamo corchetes. También hay corchetes, a los que ustedes llaman llaves, creo. Trataré de llamar a los paréntesis 'corchetes redondos' para evitar confusiones, pero si me refiero a un 'corchete', me refiero a un paréntesis.

Voy a envolver mi dir comando entre corchetes y asígnelo a una variable.

Ahora puedo canalizar $configfilelist en Measure-Object y será más receptivo, porque he almacenado mis resultados.

Pero porque $configfilelist es una matriz de archivos, también puedo ver su longitud para ver que hay tres elementos. Eso es mucho más fácil. Y puedo acceder a cada uno de ellos utilizando corchetes del 0 al 2.

Esto no es exactamente algo innovador todavía. Pero esos archivos nos dicen algunas cosas útiles. Hagamos un Get-Member comando en nuestra matriz.

No se desanime por esto. En la parte superior podemos ver que estamos tratando con objetos que son del tipo System.IO.FileInfo . Esto es algo de .Net y es de donde proviene el poder. Podemos ver que podríamos llamar al Delete métodos de estos archivos, o CopyTo o Decrypt (si estuvieran encriptados, pero no lo están), y más. Abajo en la parte inferior vemos Propiedades.

Esto es más interesante. Veamos LastWriteTime . Porque nos podría interesar saber cuándo es eso.

Podemos usar Select-Object para mostrar sólo ciertas propiedades.

Como era de esperar, no se ha escrito nada en esos archivos desde que se realizaron las instalaciones. Pero, ¿y si quisiera filtrar esto, solo a unos desde un punto particular en el tiempo?

Voy a usar Get-Date para obtener la fecha y hora actuales. Voy a envolver eso entre corchetes y usar su AddYears método para encontrar hace un año. En el mundo real, estaría más inclinado a usar AddDays , pero quiero obtener algunos resultados.

Y voy a filtrar $configfilelist pasando a Where-Object (excepto que voy a usar un atajo conveniente que es el signo de interrogación). Mi filtro vive entre corchetes ("llaves", ¿verdad?), y dentro de esos corchetes me refiero a las cosas en $configfilelist usando $_ .

Entonces mi filtro es así, diciendo que quiero enumerar los que tienen un LastWriteTime mayor que (-gt ) un año antes de ahora:

Y solo obtengo un archivo. Fantástico.

Eso está muy bien, pero ahora quiero saber de qué se trataba esa instalación. Para eso necesitamos mirar dentro del archivo. Get-Content es nuestro amigo aquí. Comencemos usando Get-Content contra un archivo directamente. Será fácil conectarlo a nuestro comando adecuado más tarde.

Get-Content en realidad devuelve una matriz de líneas y tiene parámetros realmente útiles como -TotalCount que se detiene después de un cierto número de líneas, o -Tail que obtiene líneas al final del archivo. Me encanta esto cuando trato con archivos grandes; no es como si pudiera abrirlos en el Bloc de notas.

Déjame contarte sobre Seleccionar cadena también. Es como grep de Unix:lo usa para obtener las líneas que desea en un archivo.

Esa salida parece una molestia, pero recuerda que esto es solo la representación de cadena de un objeto. Si canalizo mi comando a gm (Get-Member ), verás lo que quiero decir.

Entonces ahora puedo decir que puedo acceder a Path del archivo, la Line , el LineNumber , etc, por separado.

Para buscar varias cosas, quiero pasar una serie de parámetros a -Pattern . Lo hago simplemente usando una coma, para descubrir que fue una instalación de Analysis Services.

Con suerte, estás empezando a ver el poder de esto.

Puedo colocarlo todo en una sola línea usando:

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

(Lo siento, es probable que tengas que desplazarte hacia los lados para ver todo eso; tener todo en una sola línea no es exactamente una virtud en HTML).

Cuando esté trabajando en cosas que le gustan, querrá almacenar los comandos en algún lugar para más tarde (como en un archivo .ps1 que ejecute). Para eso, debes estar al tanto de Get-History . Enumera todo lo que ha ejecutado en esa sesión.

Y un pequeño truco ingenioso es que puede usar números negativos para conectar matrices desde el otro extremo. Así que puedes hacer esto:

Pero en lugar de simplemente mostrarlo, canalícelo en clip :

…que lo coloca en el portapapeles.

No voy a ir mucho más lejos con esto, pero podrías seguir empujando esto más y más tú mismo, explorando los tipos de cosas que podrían ser interesantes en tu trabajo. Puede volcar los resultados en archivos usando > y agregar a los archivos usando >> .

Ahora considere comandos como:

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

…e imagina lo que podrías hacer con eso.

Intenta hacer:Import-Module SQLServer

Que luego te deja ir:

cd SQLSERVER:

Y explore el entorno SQL como si fuera un sistema de archivos.

No suelo usar PowerShell para explorar SQL como este muy a menudo, debo admitirlo. Pero el hecho de que pueda ciertamente me da un montón de opciones. El hecho de que pudiera usar PowerShell para crear un documento de Word como lo hacen en https://learn-powershell.net/2014/12/31/beginning-with-powershell-and-word/, o enviar correos electrónicos como se describe en https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/send-mailmessage, o llame a los servicios web (incluidos los de Azure Machine Learning) como se describe en https://docs.microsoft .com/en-gb/powershell/module/Microsoft.PowerShell.Utility/Invoke-WebRequest significa que, con un poco de imaginación, puede usar PowerShell para hacer casi lo que quiera. Me encanta usar Invoke-SqlCommand para obtener datos de SQL, insertarlos en Invoke-WebRequest para obtener puntajes de Azure ML y luego responder en consecuencia. PowerShell lo hace realmente sencillo.

Ah, y para ejecutar los comandos de PowerShell en otras máquinas (lo que puede ser bastante útil, por supuesto), una rápida "búsqueda en Internet" me mostró esta página de aspecto útil:https://www.howtogeek.com/117192/how-to -ejecutar-comandos-de-powershell-en-computadoras-remotas/

Podría tener una lista de computadoras dentro de un archivo y recorrerlo así:

Prueba algunas cosas. Noquearte a ti mismo. Y explore lo que todos están escribiendo para T-SQL el martes de este mes, presentado por Rob Sewell (@sqldbawithbeard)

@rob_farley