2011-01-14 19 views
11

sono davvero appassionato di capacità di pitone di fare cose come questa:Powershell equivilent di pitone di if __name__ == '__main__':

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

Questo è bello perché posso trattare un file di script Python come qualcosa che può essere chiamato dalla riga di comando ma rimane disponibile per me per importare facilmente le sue funzioni e classi in un file di script Python separato senza attivare l'impostazione predefinita "Esegui dal comportamento della riga di comando".

Powershell ha una struttura simile che potrei sfruttare? E se non fosse così, come dovrei organizzare la mia libreria di file di funzioni in modo che io possa eseguire facilmente alcuni di essi mentre li sto sviluppando?

risposta

5

$MyInvocation ha molte informazioni sul contesto attuale e su quelle dei chiamanti. Forse questo potrebbe essere usato per rilevare se uno script è dot-sourced (cioè importato) o eseguito come script.

Uno script può funzionare come una funzione: utilizzare param come primo spazio non comune nel file per definire i parametri. Non è chiaro (è necessario provare diverse combinazioni) cosa succede se si crea uno script che inizia param ...

I moduli possono eseguire direttamente il codice così come esportare funzioni, variabili, ... e può prendere i parametri. Forse $MyInvocation in un modulo consentirebbe di rilevare i due casi.

EDIT: Altre:

$MyInvocation.Line contiene la riga di comando utilizzata per eseguire lo script o la funzione corrente. La sua proprietà Line ha il testo script utilizzato per l'esecuzione, quando il dot-sourcing inizierà con "." ma non se eseguito come script (ovviamente un caso per utilizzare una corrispondenza regolare per consentire spazi bianchi variabili nel periodo).

In uno script eseguito in funzione

+0

Quindi, qualcosa sulla falsariga di: if (!. "" $ MyInvocation.Line.Trim() StartsWith()) { #Scripty tipo invocazione accade qui } –

+0

+ 1 per utilizzare i moduli di PowerShell v2.0. – x0n

+0

@MarkMascolino: dopo un rapido test, può avere '. script', non solo uno spazio. Vorrei usare '-match '^ \ s + \. \ S +''. – Richard

2

$MyInvocation.Invocation ha informazioni su come è stato avviato lo script.

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

Disclaimer: questo è testato solo su Powershell Core su Linux. Potrebbe non funzionare allo stesso modo per Windows. Se qualcuno lo prova su Windows, sarei grato se potessi verificare nei commenti.

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

Demonstrated with a gist

Problemi correlati