2012-02-21 5 views
9

He puesto mis funciones en un archivo separado y me llaman el archivo con:funciones de puesta en guión y separada de puntos y abasteciéndose - ¿cuál será el alcance

$workingdir = Split-Path $MyInvocation.MyCommand.Path -Parent 
. "$workingdir\serverscan-functions.ps1"       

Pero, si llamo a los scripts como

my-function 

¿cómo será el alcance variable (desde dentro de "mi-función")? ¿Debo todavía $ script: variable para hacer que la variable exista fuera de la función o también tengo dot-sourced the function?

espero no confundir a nadie con mi pregunta ... He intentado que sea lo más comprensible posible, pero todavía está aprendiendo todo el concepto básico por lo que resulta difícil de explicar ..

Respuesta

18

Cuando usted puntea el código fuente se comportará como si ese código todavía estuviera en el script original. Los ámbitos serán los mismos que si estuviera todo en un solo archivo.

C: \ code functions.ps1:

$myVariable = "Test" 

function Test-DotSource { 
    $script:thisIsAvailableInFunctions = "foo" 
    $thisIsAvailableOnlyInThisFunction = "bar" 
} 

código main.ps1

$script:thisIsAvailableInFunctions = "" 

. C:\functions.ps1 

# Call the function to set values. 
Test-DotSource 

$script:thisIsAvailableInFunctions -eq "foo" 
# Outputs True because of the script: scope modifier 

$thisIsAvailableOnlyInThisFunction -eq "bar" 
# Outputs False because it's undefined in this scope. 

$myVariable -eq "Test"      
# Outputs true because it's in the same scope due to dot sourcing. 
+0

Así que esto significa que todas las variables creadas en una función en el exterior archivo (serverscan-functions.ps1) será accesible fuera de la función? ¿Hay alguna manera de evitar esto y aún tener mis funciones en un archivo separado? – Sune

+1

@Sune Actualicé mi respuesta con algunos ejemplos. Espero que ayude –

+0

¡Justo lo que estaba buscando! – Sune

2

Con el fin de lograr lo que quiere, es probable que necesita para crear un módulo. En el módulo, exporte las funciones usando Export-ModuleMember, y siempre y cuando no exporte explícitamente ninguna variable como miembros del módulo, debería estar bien.

Una vez que haya creado el módulo, impórtelo con el cmdlet Import-Module.

1

Mis 2cents:

Por lo general (después de un pasado Andy Arismendi respuesta que Dios los bendiga hombre!) Puedo guardar todos mis scripts en $pwd carpeta (añadido en el entorno de ruta del sistema). Puedo llamarlos desde la consola sin dot sourcing y sin secuencia de comandos que envenene la consola después de que un script finalice su trabajo.

Si no puede modificar las funciones Suyo en las secuencias de comandos simples (a veces sucede) Estoy de acuerdo con la respuesta Trevor para crear un módulo e importarlo en $profile

Cuestiones relacionadas