2011-01-14 14 views
11

soy muy aficionado a la capacidad del pitón para hacer cosas como esta:Powershell equivilent de Python si __name__ == '__main__':

if __name__ == '__main__': 
    #setup testing code here 
    #or setup a call a function with parameters and human format the output 
    #etc... 

Esto es bueno porque puedo tratar a un archivo de script Python como algo que puede ser llamado desde la línea de comando, pero sigue estando disponible para que yo pueda importar sus funciones y clases en un archivo de comandos de python por separado sin activar el "ejecutar desde el comportamiento de la línea de comandos".

¿Tiene Powershell una facilidad similar que podría explotar? Y si no es así, ¿cómo debería estar organizando mi biblioteca de archivos de funciones para que pueda ejecutarlos fácilmente mientras los estoy desarrollando?

Respuesta

5

$MyInvocation tiene mucha información sobre el contexto actual, y los de las personas que llaman. Tal vez esto podría usarse para detectar si un script está siendo fuente de puntos (es decir, importado) o ejecutado como un script.

Un script puede actuar como una función: use param como el primer espacio no común/blanco del archivo para los parámetros definidos. No está claro (sería necesario probar diferentes combinaciones) qué sucede si puntea-fuente un script que comienza param ...

Los módulos pueden ejecutar código directamente así como exportar funciones, variables, ... y pueden tomar parámetros Tal vez $MyInvocation en un módulo permitiría detectar los dos casos.

EDIT: adicional:

$MyInvocation.Line contiene la línea de comandos para ejecutar el script o función actual. Su propiedad Line tiene el texto scrip utilizado para la ejecución, cuando dot-sourcing esto comenzará con "." pero no si se ejecuta como un script (obviamente un caso para usar una coincidencia de expresiones regulares para permitir espacios en blanco variables alrededor del período).

En un script que se ejecuta en función

+0

Así que algo a lo largo de las líneas de: if (!. "" $ MyInvocation.Line.Trim() StartsWith()) { tipo #Scripty invocación sucede aquí } + –

+0

1 a usar los módulos de powershell v2.0. – x0n

+0

@MarkMascolino: después de una prueba rápida, puede tener '. script', no solo un espacio. Yo usaría '-match '^ \ s + \. \ S +''. – Richard

2

$MyInvocation.Invocation tiene información sobre cómo se inició el guión.

If ($MyInvocation.InvocationName -eq '&') { 
    "Called using operator: '$($MyInvocation.InvocationName)'" 
} ElseIf ($MyInvocation.InvocationName -eq '.') { 
    "Dot sourced: '$($MyInvocation.InvocationName)'" 
} ElseIf ((Resolve-Path -Path $MyInvocation.InvocationName).ProviderPath -eq $MyInvocation.MyCommand.Path) { 
    "Called using path: '$($MyInvocation.InvocationName)'" 
} 
0

Descargo de responsabilidad: Esto solo se prueba en Powershell Core en Linux. Puede no funcionar igual para Windows. Si alguien lo prueba en Windows, le agradecería si pudiera verificar en los comentarios.

function IsMain() { 
    (Get-Variable MyInvocation -Scope Local).Value.PSCommandPath -Eq (Get-Variable MyInvocation -Scope Global).Value.InvocationName 
} 

Demonstrated with a gist

Cuestiones relacionadas