sintaxis script principales microsoft comandos powershell

principales - script en powershell



En PowerShell, ¿cómo defino una función en un archivo y la llamo desde la línea de comandos de PowerShell? (6)

Tengo un archivo .ps1 en el que quiero definir funciones personalizadas.

Imagine que el archivo se llama MyFunctions.ps1 y el contenido es el siguiente:

Write-Host "Installing functions" function A1 { Write-Host "A1 is running!" } Write-Host "Done"

Para ejecutar este script y registrar teóricamente la función A1, navego hasta la carpeta en la que reside el archivo .ps1 y ejecuto el archivo:

./MyFunctions.ps1

Esto produce:

Installing functions Done

Sin embargo, cuando trato de llamar a A1, simplemente obtengo el error que indica que no hay ningún comando / función con ese nombre:

The term ''A1'' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At line:1 char:3 + A1 <<<< + CategoryInfo : ObjectNotFound: (A1:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException

Debo malinterpretar algunos conceptos de PowerShell. ¿No puedo definir funciones en archivos de script?

Tenga en cuenta que ya he configurado mi política de ejecución en ''RemoteSigned''. Y sé que ejecutar archivos .ps1 usando un punto delante del nombre del archivo:. / MyFile.ps1


Ciertamente se pueden definir funciones en archivos de script (entonces, tienden a cargarlos a través de mi perfil Powershell en carga).

Primero debe verificar que la función esté cargada ejecutando:

ls function:/ | where { $_.Name -eq "A1" }

Y verifique que aparezca en la lista (¡debería ser una lista de 1!), ¡Y cuéntenos qué resultado obtiene!


De lo que estás hablando se llama dot sourcing . Y es malvado Pero no se preocupe, hay una forma mejor y más fácil de hacer lo que está buscando con módulos (suena mucho más aterrador de lo que es). La principal ventaja de utilizar módulos es que puedes descargarlos desde el shell si es necesario, y evita que las variables en las funciones entren sigilosamente en el shell (una vez que salpiques el origen de un archivo de función, intenta llamar a una de las variables desde un funcionar en el shell, y verás lo que quiero decir).

Primero, cambie el nombre del archivo .ps1 que tiene todas sus funciones en MyFunctions.psm1 (¡acaba de crear un módulo!). Ahora, para que un módulo se cargue correctamente, debe hacer algunas cosas específicas con el archivo. Primero para Import-Module para ver el módulo (usted usa este cmdlet para cargar el módulo en el shell), tiene que estar en una ubicación específica. La ruta predeterminada a la carpeta de módulos es $ home / Documents / WindowsPowerShell / Modules.

En esa carpeta, cree una carpeta llamada MyFunctions y coloque el archivo MyFunctions.psm1 en ella (el archivo del módulo debe residir en una carpeta con exactamente el mismo nombre que el archivo PSM1).

Una vez hecho esto, abra PowerShell y ejecute este comando:

Get-Module -listavailable

Si ve una llamada MyFunctions, lo hizo bien y su módulo está listo para ser cargado (esto es solo para asegurarse de que esté configurado correctamente, solo tiene que hacer esto una vez).

Para usar el módulo, escriba lo siguiente en el intérprete de comandos (o ponga esta línea en su perfil $, o ponga esto como la primera línea en un guión):

Import-Module MyFunctions

Ahora puede ejecutar sus funciones. Lo bueno de esto es que una vez que tienes 10-15 funciones allí, vas a olvidar el nombre de una pareja. Si los tiene en un módulo, puede ejecutar el siguiente comando para obtener una lista de todas las funciones de su módulo:

Get-Command -module MyFunctions

Es bastante dulce, y el pequeño esfuerzo que se requiere para establecerse en el frente es MUY vale la pena.


Pruebe esto en la línea de comandos de PowerShell:

. ./MyFunctions.ps1 A1

El operador de punto se usa para script include.


Puede agregar funciones a c: / Users / David / Documents / WindowsPowerShell / profile.ps1 La función estará disponible.


Si su archivo tiene solo una función principal a la que desea llamar / exponer, entonces también puede simplemente iniciar el archivo con:

Param($Param1)

A continuación, puede llamarlo, por ejemplo, de la siguiente manera:

./MyFunctions.ps1 -Param1 ''value1''

Esto lo hace mucho más conveniente si desea llamar fácilmente a esa función sin tener que importar la función.


. "$PSScriptRoot/MyFunctions.ps1" MyA1Func

Puede comenzar en v3, antes de eso, consulte ¿Cómo puedo obtener la ubicación del sistema de archivos de un script de PowerShell? . Es muy común.

PD: No me suscribo a la regla ''todo es un módulo''. Mis scripts son utilizados por otros desarrolladores fuera de GIT, por lo que no me gusta poner cosas en un lugar específico o modificar las variables de entorno del sistema antes de que se ejecute mi script. Es solo un script (o dos, o tres).