2010-05-05 6 views

Antwort

7

Ahh das macht oft Leute in PowerShell. Obwohl PowerShell die Vorstellung eines aktuellen Verzeichnisses hat, ist dies nicht dasselbe wie das aktuelle Verzeichnis für den Prozess. Der Grund dafür ist, dass ein Windows-Prozess nur ein aktuelles Verzeichnis haben kann, während ein PowerShell-Prozess mehrere Runspaces/Pipelines mit jeweils einem aktuellen Verzeichnis haben kann und das aktuelle PowerShell-Verzeichnis möglicherweise nicht einmal ein Speicherort ist.

.NET-Methoden, die relative Pfade verwenden, werden gegen das aktuelle Verzeichnis des Prozesses aufgelöst. Um sicherzugehen, sollten Sie bei jedem Aufruf von .NET-Methoden vollständig aufgelöste Pfade verwenden. Sie tun können:

PS> (New-Object IO.FileInfo "$PWD\test.txt").FullName 

$ PWD wird innerhalb der Zeichenfolge erweitert (wegen der doppelten Anführungszeichen) und dessen eine automatische Variable, die den aktuellen Arbeitsverzeichnis immer zurückgibt. Es gibt tatsächlich ein PathInfo-Objekt zurück, da die eingebettete Zeichenfolge möglicherweise nicht immer der absolute physische Pfad ist. Wenn Sie PSDrives verwenden (zum Beispiel habe ich ein temporäres Laufwerk in meinem temporären Verzeichnis), müssen Sie expliziter sein.

PS> (New-Object IO.FileInfo "$($PWD.ProviderPath)\test.txt").FullName 

Ein PowerShell-Guru kann eine präzisere Syntax haben. Das Obige ist zugegebenermaßen ziemlich hässlich.

Verwandte Themen