Wenn ich zwei Zeichenfolgen zu einem Dateipfad kombinieren möchte, verwende ich Folgendes Join-Path
:
$path = Join-Path C: "Program Files"
Write-Host $path
Das druckt "C:\Program Files"
. Wenn ich dies jedoch für mehr als zwei Zeichenfolgen tun möchte:
$path = Join-Path C: "Program Files" "Microsoft Office"
Write-Host $path
PowerShell gibt einen Fehler aus:
Join-Pfad: Es kann kein Positionsparameter gefunden werden, der das Argument 'Microsoft Office' akzeptiert.
Unter D: \ users \ ma \ my_script.ps1: 1 char: 18
+ $ path = Join-Pfad <<<< C: "Programme" "Microsoft Office"
+ CategoryInfo: InvalidArgument: (:) [Join-Path] , ParameterBindingException
+ FullyQualifiedErrorId: PositionalParameterNotFound, Microsoft.PowerShell
.Commands.JoinPathCommand
Ich habe versucht, ein String-Array zu verwenden:
[string[]] $pieces = "C:", "Program Files", "Microsoft Office"
$path = Join-Path $pieces
Write-Host $path
PowerShell fordert mich jedoch auf, den untergeordneten Pfad einzugeben (da ich das -childpath
Argument nicht angegeben habe ), z. B. "somepath", und erstellt dann drei Dateipfade.
C:\somepath
Program Files\somepath
Microsoft Office\somepath
was auch nicht richtig ist.
quelle
$PSVersionTable
)? Funktioniert[io.path]::combine([string[]]('c:\','foo','bar'))
?join-path
tut, was Sie erwarten,join-path "C:\" "\foo"
gibt ausC:\foo
,Path.Combine
ignoriert jedoch das erste Argument, wenn das zweite Argument ein führendes Trennzeichen enthält:[io.path]::combine('c:\', '\foo')
ärgerlich Ausgaben\foo
.Da Join-Path einen Pfadwert weiterleiten kann, können Sie mehrere Join-Path-Anweisungen zusammen leiten:
Es ist nicht so knapp, wie Sie es wahrscheinlich gerne hätten, aber es ist vollständig PowerShell und relativ einfach zu lesen.
quelle
Seit PowerShell 6.0 hat Join-Path einen neuen Parameter namens
-AdditionalChildPath
und kann mehrere Teile eines sofort einsatzbereiten Pfads kombinieren . Entweder durch Angabe des zusätzlichen Parameters oder durch Angabe einer Liste von Elementen.Beispiel aus der Dokumentation :
Also in PowerShell 6.0 und höher Ihre Variante
funktioniert wie erwartet!
quelle
Join-Path ist nicht genau das, wonach Sie suchen. Es hat mehrere Verwendungszwecke, aber nicht den, den Sie suchen. Ein Beispiel aus dem Feiern mit Join-Path :
Sie sehen, dass es ein Array von Zeichenfolgen akzeptiert und die untergeordnete Zeichenfolge mit jeder verknüpften vollständigen Pfad verknüpft. In Ihrem Beispiel
$path = join-path C: "Program Files" "Microsoft Office"
. Sie erhalten den Fehler, da Sie drei Positionsargumente übergeben undjoin-path
nur zwei akzeptieren. Was Sie suchen, ist ein-join
, und ich könnte sehen, dass dies ein Missverständnis ist. Betrachten Sie dies stattdessen anhand Ihres Beispiels:-Join
Nimmt das Array von Elementen und verkettet sie mit\
einer einzigen Zeichenfolge.Kleiner Versuch einer Bergung
Ja, ich werde zustimmen, dass diese Antwort besser ist, aber meine könnte noch funktionieren. Kommentare deuten darauf hin, dass möglicherweise ein Problem mit Schrägstrichen vorliegt. Um meinen Verkettungsansatz beizubehalten, können Sie dies auch tun.
Wenn es also Probleme mit zusätzlichen Schrägstrichen gibt, kann dies behoben werden, solange sie sich nicht am Anfang der Zeichenfolge befinden (erlaubt UNC- Pfade).
[io.path]::combine('c:\', 'foo', '\bar\')
würde nicht wie erwartet funktionieren und meine würde das erklären. Für beide sind geeignete Zeichenfolgen für die Eingabe erforderlich, da Sie nicht alle Szenarien berücksichtigen können. Betrachten Sie beide Ansätze, aber ja, die andere höher bewertete Antwort ist knapper, und ich wusste nicht einmal, dass es sie gibt.Ich möchte auch darauf hinweisen, dass meine Antwort erklärt, wie das OP falsch war, zusätzlich zu einem Vorschlag zur Lösung des Kernproblems.
quelle
Wenn Sie immer noch .NET 2.0 verwenden,
[IO.Path]::Combine
wird nicht dieparams string[]
Überladung vorhanden sein, die Sie zum Verbinden von mehr als zwei Teilen benötigen, und es wird der Fehler "Überladung für" Kombinieren "und die Argumentanzahl" 3 "wird nicht gefunden.Etwas weniger elegant, aber eine reine PowerShell-Lösung besteht darin, Pfadteile manuell zu aggregieren:
oder
quelle
Hier ist etwas, das genau das tut, was Sie möchten, wenn Sie ein String-Array für ChildPath verwenden.
Welche Ausgänge
Die einzige Einschränkung, die ich gefunden habe, ist, dass der Anfangswert für $ path einen Wert haben muss (darf nicht null oder leer sein).
quelle
Hier sind zwei weitere Möglichkeiten, eine reine PowerShell-Funktion zu schreiben, um eine beliebige Anzahl von Komponenten zu einem Pfad zusammenzufügen.
Diese erste Funktion verwendet ein einzelnes Array, um alle Komponenten zu speichern, und dann eine foreach-Schleife, um sie zu kombinieren:
Da die Pfadkomponenten Elemente in einem Array sind und alle Teil eines einzelnen Arguments sind, müssen sie durch Kommas getrennt werden. Die Verwendung ist wie folgt:
Eine minimalistischere Methode zum Schreiben dieser Funktion besteht darin, die integrierte
$args
Variable zu verwenden und dann die foreach-Schleife mithilfe der Methode von Mike Fair in eine einzelne Zeile zu reduzieren.Im Gegensatz zur vorherigen Version der Funktion ist jede Pfadkomponente ein separates Argument, sodass nur ein Leerzeichen erforderlich ist, um die Argumente zu trennen:
quelle
Der folgende Ansatz ist prägnanter als das Weiterleiten von Join-Path-Anweisungen:
$ p enthält dann den verketteten Pfad 'a \ b \ c \ d'.
(Mir ist gerade aufgefallen, dass dies genau der gleiche Ansatz ist wie der von Mike Fair, sorry.)
quelle
Oder Sie könnten Ihre eigene Funktion dafür schreiben (was ich letztendlich getan habe).
Sie können die Funktion dann folgendermaßen aufrufen:
Dies hat den Vorteil, dass es genau das gleiche Verhalten wie die normale Join-Path-Funktion aufweist und nicht vom .NET Framework abhängt.
quelle
Sie können es folgendermaßen verwenden:
quelle