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 a la carpeta en la que reside el archivo .ps1 y ejecuto el archivo:
.\MyFunctions.ps1
Esto produce:
Installing functions
Done
Sin embargo, cuando intento llamar a A1, simplemente recibo el error que indica que no hay 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 entender mal algunos conceptos de PowerShell. ¿No puedo definir funciones en archivos de script?
Tenga en cuenta que ya he establecido mi política de ejecución en 'RemoteSigned'. Y sé ejecutar archivos .ps1 usando un punto delante del nombre del archivo:. \ MyFile.ps1
powershell
willem
fuente
fuente
Respuestas:
Pruebe esto en la línea de comandos de PowerShell:
El operador de punto se utiliza para incluir script.
fuente
. "$PSScriptRoot\MyFunctions.ps1"
. Disponible a partir de la v3, antes de eso consulte stackoverflow.com/questions/3667238/… . Es muy común.Lo que estás hablando se llama abastecimiento de puntos . Y es malvado. Pero no se preocupe, hay una manera mejor y más fácil de hacer lo que desea con los módulos (suena mucho más aterrador de lo que es). El beneficio principal de usar módulos es que puede descargarlos del shell si lo necesita, y evita que las variables en las funciones se arrastren en el shell (una vez que obtiene un archivo de función, intente llamar a una de las variables funciona 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, Import-Module para ver el módulo (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:
Si ve uno llamado MyFunctions, lo hizo bien y su módulo está listo para cargarse (esto es solo para asegurarse de que está configurado correctamente, solo tiene que hacerlo una vez).
Para usar el módulo, escriba lo siguiente en el shell (o ponga esta línea en su $ profile, o ponga esto como la primera línea en un script)
Ahora puede ejecutar sus funciones. Lo bueno de esto es que una vez que tenga 10-15 funciones allí, 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:
Es bastante dulce, y el pequeño esfuerzo que se requiere para configurar en la parte delantera vale la pena.
fuente
Import-Module .\buildsystem\PSUtils.psm1
.
conImport-Module
y cambiar el nombre de la extensión, y no requiere que los módulos sean colocados en una carpeta específica, es decir, que se puede tener en cualquier directorio que quiero, al igual que con el abastecimiento de puntos, se ¿Hay alguna razón para hacer incluso el abastecimiento de puntos sobre los módulos, teniendo en cuenta los beneficios que vienen para el alcance? (a menos, por supuesto, que esos "problemas" de alcance sean lo que quieres). "$PSScriptRoot\MyFunctions.ps1" MyA1Func
Disponible a partir de la v3, antes de eso vea ¿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 mi script se ejecute. Es solo un guión (o dos, o tres).
fuente
Get-Command -Module FluentMigrator.PowerShell
es bastante buena?Ciertamente puede definir funciones en archivos de script (luego tiendo a cargarlas a través de mi perfil de Powershell al cargar).
Primero debe verificar para asegurarse de que la función se carga ejecutando:
Y compruebe que aparece en la lista (¡debería ser una lista de 1!), ¡Luego díganos qué resultado obtiene!
fuente
Puede agregar funciones a:
Y la función estará disponible.
fuente
Si su archivo tiene solo una función principal a la que desea llamar / exponer, entonces también puede comenzar el archivo con:
Luego puede llamarlo, por ejemplo, de la siguiente manera:
Esto lo hace mucho más conveniente si desea llamar fácilmente a esa función sin tener que importar la función.
fuente
[CmdletBinding()]
atributo y lo actualiza de forma gratuita a una función avanzada. :-)Suponiendo que tiene un archivo de módulo llamado Dummy-Name.psm1 que tiene un método llamado Function-Dumb ()
fuente