2011-01-14 6 views
11

bin ich wirklich gern Fähigkeit des Python Dinge wie dies zu tun:Powershell equivilent von Pythons, wenn __name__ == ‚__main__‘:

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

Das ist schön, weil ich ein Python-Skript-Datei als etwas behandeln das kann von der Kommandozeile aufgerufen werden, aber es bleibt für mich verfügbar, seine Funktionen und Klassen leicht in eine separate Python-Skriptdatei zu importieren, ohne den Standard "run from the command line behaviour" auszulösen.

Hat Powershell eine ähnliche Einrichtung, die ich ausnutzen könnte? Und wenn es nicht so ist, wie sollte ich meine Bibliothek von Funktionsdateien organisieren, damit ich einige davon einfach ausführen kann, während ich sie entwickle?

Antwort

5

$MyInvocation hat viele Informationen über den aktuellen Kontext und die der Anrufer. Vielleicht könnte dies verwendet werden, um zu erkennen, ob ein Skript dot-sourced (d. H. Importiert) oder als Skript ausgeführt wird.

Ein Skript kann wie eine Funktion funktionieren: Verwenden Sie param als erste nicht-gemeinsame/Leerzeichen in der Datei zu definierten Parametern. Es ist nicht klar (man müsste verschiedene Kombinationen ausprobieren) Was passiert, wenn man ein Skript per Dot-Source startet param ...

Module können Code direkt ausführen sowie Funktionen, Variablen, ... exportieren und exportieren nimm Parameter. Vielleicht $MyInvocation in einem Modul würde die beiden Fälle erkannt werden können.

EDIT: Zusätzlich:

$MyInvocation.Line enthält den Zeilenbefehl verwendet, um das aktuelle Skript oder Funktion auszuführen. Seine Line Eigenschaft hat den Scrip-Text, der für die Ausführung verwendet wird, wenn das Punkt-Sourcing dies mit "." startet, aber nicht, wenn es als Skript ausgeführt wird (offensichtlich ein Fall, um eine Regex-Übereinstimmung zu verwenden, um variable Leerzeichen um den Zeitraum zuzulassen).

In einem Skript als eine Funktion ausführen

+0

So etwas entlang der Linien von: if (! "." $ MyInvocation.Line.Trim() Starts()) { #Scripty Typ Aufruf geschieht hier } –

+0

+ 1 um Powershell v2.0 Module zu verwenden. – x0n

+0

@MarkMascolino: nach einem schnellen Test kann '. Skript ', nicht nur ein Leerzeichen. Ich würde '-match'^\ s + \. \ S + ''verwenden. – Richard

2

$MyInvocation.Invocation haben Informationen darüber, wie das Skript gestartet wurde.

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

Haftungsausschluss: Diese nur auf Powershell-Core auf Linux getestet. Es funktioniert möglicherweise nicht gleich für Windows. Wenn jemand es unter Windows versucht, würde ich mich freuen, wenn Sie dies in den Kommentaren überprüfen könnten.

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

Demonstrated with a gist

Verwandte Themen