Hinweis: PowerShell 1.0
Ich möchte den aktuell ausgeführten PowerShell-Dateinamen erhalten. Das heißt, wenn ich meine Sitzung so beginne:
powershell.exe .\myfile.ps1
Ich möchte die Zeichenfolge ". \ Myfile.ps1" (oder so ähnlich) erhalten. BEARBEITEN : "myfile.ps1" ist vorzuziehen.
Irgendwelche Ideen?
powershell
Ron Klein
quelle
quelle
Antworten:
Ich habe versucht, die verschiedenen Antworten hier zusammenzufassen, die für PowerShell 5 aktualisiert wurden:
$PSCommandPath
Wenn Sie Kompatibilität mit älteren Versionen wünschen, fügen Sie die Unterlegscheibe ein:
if ($PSCommandPath -eq $null) { function GetPSCommandPath() { return $MyInvocation.PSCommandPath; } $PSCommandPath = GetPSCommandPath; }
Dies fügt hinzu
$PSCommandPath
wenn es noch nicht existiert.Der Shim-Code kann überall ausgeführt werden (auf oberster Ebene oder innerhalb einer Funktion), obwohl die
$PSCommandPath
Variable normalen Gültigkeitsregeln unterliegt (z. B. wenn Sie den Shim in eine Funktion einfügen, wird die Variable nur für diese Funktion verwendet).Einzelheiten
Es gibt 4 verschiedene Methoden, die in verschiedenen Antworten verwendet werden. Deshalb habe ich dieses Skript geschrieben, um jedes (Plus
$PSCommandPath
) zu demonstrieren :Ausgabe:
Anmerkungen:
C:\
, aber das eigentliche Skript istC:\Test\test.ps1
..\Test\test.ps1
)$PSCommandPath
ist der einzig zuverlässige Weg, wurde jedoch in PowerShell 3 eingeführtquelle
$PSCommandPath
wenn Legacy (WindowsXP) nicht erforderlich ist.Obwohl die aktuelle Antwort in den meisten Fällen richtig ist, gibt es bestimmte Situationen, in denen Sie nicht die richtige Antwort erhalten. Wenn Sie in Ihrem Skript Funktionen verwenden, dann:
Gibt den Namen der Funktion anstelle des Namens des Skripts zurück.
Gibt Ihnen " Test ", egal wie Ihr Skript benannt ist. Der richtige Befehl zum Abrufen des Skriptnamens lautet immer
Dies gibt den vollständigen Pfad des Skripts zurück, das Sie ausführen. Wenn Sie nur den Skriptdateinamen benötigen, sollte Ihnen dieser Code helfen:
quelle
$MyInvocation.ScriptName
Rückgabe einer leeren Zeichenfolge für mich, PS v3.0.$MyInvocation.ScriptName
funktioniert nur innerhalb einer Funktion. Siehe meine Antwort unten .Wenn Sie nur den Dateinamen (nicht den vollständigen Pfad) möchten, verwenden Sie Folgendes:
quelle
Versuche Folgendes
Dadurch erhalten Sie möglicherweise nicht den tatsächlich eingegebenen Pfad, aber einen gültigen Pfad zur Datei.
quelle
$path = Split-Path $MyInvocation.MyCommand.Definition -Parent
Wenn Sie nach dem aktuellen Verzeichnis suchen, in dem das Skript ausgeführt wird, können Sie Folgendes ausprobieren:
quelle
C:\ilike.ps123\ke.ps1
, oder?Replace()
Methode jedes Vorkommen der Nadel (nicht nur das letzte Vorkommen) ersetzt und ich es auch getestet habe. Es ist jedoch eine gute Idee, so etwas wie Subtraktion auf Strings durchzuführen.String.TrimEnd()
($currentExecutingPath = $fullPathIncFileName.TrimEnd($currentScriptName)
)? - Es funktioniert richtig:"Ich bin Hamster".TrimEnd("ster")
kehrt zurückIch bin Ham
und"Ich bin Hamsterchen".TrimEnd("ster")
kehrt zurückIch bin Hamsterchen
(stattIch bin Hamchen
) - Gut!$currentScriptPath = $MyInvocation.MyCommand.Definition; $currentScriptName = $MyInvocation.MyCommand.Name; $currentScriptDir = $currentScriptPath.Substring(0,$currentScriptPath.IndexOf($currentScriptName));
Achtung: Im Gegensatz zu den
$PSScriptRoot
und$PSCommandPath
automatischen Variablen enthalten diePSScriptRoot
undPSCommandPath
-Eigenschaften der$MyInvocation
automatischen Variablen Informationen zum Aufrufer oder zum aufrufenden Skript, nicht zum aktuellen Skript.z.B
... wo
DPM.ps1
enthältquelle
Ich würde argumentieren, dass es eine bessere Methode gibt, indem der Bereich der Variablen $ MyInvocation.MyCommand.Path festgelegt wird:
ex> $ script : MyInvocation.MyCommand.Name
Diese Methode funktioniert unter allen Umständen des Aufrufs:
EX: Somescript.ps1
AUSGABE:
Beachten Sie, dass die oben akzeptierte Antwort beim Aufruf von Main KEINEN Wert zurückgibt. Beachten Sie außerdem, dass die oben akzeptierte Antwort den vollständigen Pfad zurückgibt, wenn die Frage nur den Skriptnamen anfordert. Die Gültigkeitsbereichsvariable funktioniert an allen Stellen.
Wenn Sie den vollständigen Pfad möchten, rufen Sie einfach an:
quelle
Wie in früheren Antworten erwähnt, unterliegt die Verwendung von "$ MyInvocation" Umfangsproblemen und liefert nicht unbedingt konsistente Daten (Rückgabewert vs. direkter Zugriffswert). Ich habe festgestellt, dass die "sauberste" (konsistenteste) Methode zum Abrufen von Skriptinformationen wie Skriptpfad, Name, Parameter, Befehlszeile usw. unabhängig vom Umfang (in Haupt- oder nachfolgenden / verschachtelten Funktionsaufrufen) die Verwendung von "Get-" ist. Variable "on" MyInvocation "...
Sie können also die gleichen Informationen wie $ PSCommandPath erhalten, aber noch viel mehr. Ich bin mir nicht sicher, aber es sieht so aus, als ob "Get-Variable" erst auf PS3 verfügbar war, also nicht viel Hilfe für wirklich alte (nicht aktualisierte) Systeme.
Es gibt auch einige interessante Aspekte bei der Verwendung von "-Scope", da Sie zurückverfolgen können, um die Namen usw. der aufrufenden Funktion (en) abzurufen. 0 = aktuell, 1 = übergeordnet usw.
Hoffe das ist etwas hilfreich.
Ref, https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-variable
quelle
Habe einige Tests mit dem folgenden Skript sowohl auf PS 2 als auch auf PS 4 durchgeführt und hatte das gleiche Ergebnis. Ich hoffe das hilft den Leuten.
Ergebnisse -
quelle
Dies kann bei den meisten Powershell-Versionen funktionieren:
Dies kann für geplante Jobs funktionieren
quelle