Dies sollte eine einfache Aufgabe sein, aber ich habe mehrere Versuche gesehen, wie der Pfad zu dem Verzeichnis abgerufen wird, in dem sich das ausgeführte Cmdlet befindet. Wenn ich zum Beispiel c:\temp\myscripts\mycmdlet.ps1
mit einer Einstellungsdatei unter c:\temp\myscripts\settings.xml
ausführte, möchte ich c:\temp\myscripts
in einer Variablen innerhalb von mycmdlet.ps1
speichern können.
Dies ist eine Lösung, die funktioniert (wenn auch etwas umständlich):
$invocation = (Get-Variable MyInvocation).Value
$directorypath = Split-Path $invocation.MyCommand.Path
$settingspath = $directorypath + '\settings.xml'
Ein anderer schlug diese Lösung vor, die nur in unserer Testumgebung funktioniert:
$settingspath = '.\settings.xml'
Ich mag den letzteren Ansatz sehr und ziehe es vor, den Dateipfad jedes Mal als Parameter zu analysieren, aber ich kann ihn nicht dazu bringen, in meiner Entwicklungsumgebung zu arbeiten. Hat jemand einen Vorschlag, was zu tun ist? Hat dies etwas mit der Konfiguration von PowerShell zu tun?
Der zuverlässige Weg, dies zu tun, ist so, wie Sie $MyInvocation.MyCommand.Path
angezeigt haben.
Die Verwendung relativer Pfade basiert auf $ pwd, in PowerShell, dem aktuellen Verzeichnis für eine Anwendung oder dem aktuellen Arbeitsverzeichnis für eine .NET-API.
Ja das sollte funktionieren. Aber wenn Sie den absoluten Pfad sehen müssen, ist dies alles, was Sie brauchen:
(Get-Item -Path ".\").FullName
Die einfachste Methode scheint die folgende vordefinierte Variable zu sein:
$PSScriptRoot
about_Automatic_Variables
und about_Scripts
Beide geben an:
In PowerShell 2.0 ist diese Variable nur in Skriptmodulen (.psm1) gültig. Ab PowerShell 3.0 ist es in allen Skripts gültig.
Ich benutze es so:
$MyFileName = "data.txt"
$filebase = Join-Path $PSScriptRoot $MyFileName
Sie können auch verwenden:
(Resolve-Path .\).Path
Der in Klammern gesetzte Teil gibt ein PathInfo
object zurück.
(Verfügbar seit PowerShell 2.0.)
Pfad ist oft null. Diese Funktion ist sicherer.
function Get-ScriptDirectory
{
$Invocation = (Get-Variable MyInvocation -Scope 1).Value;
if($Invocation.PSScriptRoot)
{
$Invocation.PSScriptRoot;
}
Elseif($Invocation.MyCommand.Path)
{
Split-Path $Invocation.MyCommand.Path
}
else
{
$Invocation.InvocationName.Substring(0,$Invocation.InvocationName.LastIndexOf("\"));
}
}
Versuchen :
(Get-Location).path
oder:
($pwd).path
Get-Location
gibt den aktuellen Standort zurück:
$Currentlocation=Get-Location
Ich mag die eine Linie Lösung :)
$scriptDir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
Versuche dies:
$WorkingDir = Convert-Path .
In Powershell 3 und höher können Sie einfach verwenden
$PSScriptRoot
Sie würden denken, dass die Verwendung von '. \' Als Pfad der Aufrufpfad ist. Aber nicht die ganze Zeit. Beispiel, wenn Sie es in einem Job ScriptBlock verwenden. In diesem Fall kann es auf% profile%\Documents zeigen.
Für das, was es wert ist, eine einzige Lösung zu sein, ist das Folgende eine funktionierende Lösung für mich.
$currFolderName = (Get-Location).Path.Substring((Get-Location).Path.LastIndexOf("\")+1)
die 1 am Ende soll das/ignorieren.
dank der Beiträge oben, die das Get-Location-Cmdlet verwenden
Um die Antwort von @Cradle zu erweitern: Sie könnten auch eine Multi-Purpose-Funktion schreiben , die Ihnen das gleiche Ergebnis für die OP-Frage liefert:
Function Get-AbsolutePath {
[CmdletBinding()]
Param(
[parameter(
Mandatory=$false,
ValueFromPipeline=$true
)]
[String]$relativePath=".\"
)
if (Test-Path -Path $relativePath) {
return (Get-Item -Path $relativePath).FullName -replace "\\$", ""
} else {
Write-Error -Message "'$relativePath' is not a valid path" -ErrorId 1 -ErrorAction Stop
}
}