Agregar fragmentos de PowerShell al código de Visual Studio
Así que recientemente trasladé mi trabajo diario a una computadora portátil diferente, una Yoga 900 con 16 GB de RAM para ser exactos. Había estado ejecutando Windows 8.1 pero decidí pasar por completo a un entorno de Windows 10. Como parte del proceso, también me propuse comenzar a usar Visual Studio Code (VS Code) para mi trabajo en PowerShell. Como muchos de ustedes, he invertido mucho en PowerShell ISE, así que sé que esto no será fácil. He personalizado PowerShell ISE ampliamente y tengo mucha memoria muscular que será necesario volver a entrenar. Uno de los elementos más importantes para mí son los fragmentos.
Confío en gran medida en Intellisense y en mis propios fragmentos para aumentar mi eficiencia cuando trabajo en un proyecto de guión. Una vez que haya instalado Visual Studio Code, junto con la extensión PowerShell, tendrá muchas opciones listas para usar. La finalización de pestañas y el intellisense parecen ser incluso más generalizados que en PowerShell ISE. Sospecho que muchos de los fragmentos en los que solía confiar ya no son necesarios en VS Code.
Pero todavía quiero algunos, así que así es como se hace.
Todos los fragmentos de VS Code se almacenan en archivos json específicos del idioma. En VS Code, haga clic en Archivo - Preferencias - Fragmentos de usuario y comience a escribir "PowerShell".
Seleccione PowerShell y presione Enter. Esto abrirá el archivo de fragmentos predeterminado que está almacenado en $env:appdata\code\user\snippets\powershell.json.
Lo que ve es un comentario que describe qué insertar. Mueva el cursor encima de la llave de cierre y escriba el nombre de su fragmento entre comillas seguido de dos puntos y una llave abierta.
"Quote" : {
El fragmento necesita un prefijo que será el texto que escriba para activar el fragmento, un cuerpo y una descripción. Termina cada línea con una coma.
"prefix": "psquote",
"body": "# Those who forget to script are doomed to repeat their work.",
"description": "my PowerShell quote"
Y termine en la siguiente línea con una llave de cierre. El resultado final debería verse así:
Utilice Ctrl+S para guardar el archivo. Abra un nuevo archivo (Ctrl+N). Por defecto, este será un archivo de texto sin formato.
Pero si haces clic en el tipo puedes cambiarlo a PowerShell. Ahora VS Code aplicará todas las funciones relacionadas con PowerShell, incluido el nuevo fragmento. Comience a escribir el prefijo:
Presione Enter y se insertará el fragmento.
Agreguemos otro fragmento. Después de la llave de cierre del fragmento de cotización, escriba una coma y presione Intro. Inicie el fragmento en la siguiente línea.
"Starting MyCommand" : {
"prefix": "startingps",
Me gusta usar esta línea en mis funciones.
Write-Verbose "[$((Get-Date).TimeofDay) BEGIN] Starting $($myinvocation.mycommand)"
Pero si pego esa línea en el archivo de fragmento, verás que hay un problema. [Actualización: me di cuenta de que tenía un error en mi código que ya solucioné, aunque las capturas de pantalla pueden mostrar el código "incorrecto"]
El texto rojo nunca es bueno y hay un garabato debajo de la apertura [. Los archivos Json pueden ser complicados. El valor del cuerpo debe citarse como una cadena, pero también necesito que el mensaje detallado se inserte como una cadena con comillas dobles para que mis variables se expandan. el truco consiste en escapar de esas comillas.
"body": "Write-Verbose \"[$((Get-Date).TimeofDay) BEGIN] Starting $($myinvocation.mycommand.)\"",
Guarde el archivo PowerShell.json, vuelva al script e inserte el fragmento "startingps".
Cerrar, pero no obtuve el $delante de la variable mycommand. En los fragmentos de VS Code puedes insertar marcadores de posición como $1 y $2. En el estado actual, VS Code cree que estoy intentando hacer eso cuando realmente necesito el $literal. Después de algunas pruebas y errores, esto parece funcionar.
Inserté otro $. Ahora, cuando guardo el archivo e inserto el fragmento, funciona como se esperaba.
Mis fragmentos hasta ahora han sido ingeniosos. Pero a menudo yo (y usted) querremos insertar varias líneas. Lo único que debe hacer diferente es insertar el cuerpo como un objeto entre un conjunto de corchetes y terminar cada línea con una coma.
"my Begin Block" : {
"prefix": "myBegin",
"body": [
"Begin {",
"\tWrite-Verbose \"[$((Get-Date).TimeofDay) BEGIN] Starting $($$myinvocation.mycommand)\"",
"}"
],
"description": "my standard begin block"
}
Si prestas mucha atención, también verás "\t" insertado antes de Write-Verbose. Esto insertará una sola pestaña.
Si necesita una línea en blanco, utilice "\r".
Claro, puede tomar un poco de tiempo configurar un fragmento, pero el punto es que es algo que usará con frecuencia y se amortizará en poco tiempo.
A medida que continúe explorando VS Code, compartiré mis experiencias aquí o en la sección PowerShell de Petri.com.