Si je veux combiner deux chaînes dans un chemin de fichier, j'utilise Join-Path
comme ceci:
$path = Join-Path C: "Program Files"
Write-Host $path
Cela s'imprime "C:\Program Files"
. Si je veux faire cela pour plus de deux chaînes cependant:
$path = Join-Path C: "Program Files" "Microsoft Office"
Write-Host $path
PowerShell génère une erreur:
Join-Path: Impossible de trouver un paramètre de position qui accepte l'argument «Microsoft Office».
À D: \ users \ ma \ my_script.ps1: 1 char: 18
+ $ path = join-path <<<< C: "Program Files" "Microsoft Office"
+ CategoryInfo: InvalidArgument: (:) [Join-Path] , ParameterBindingException
+ FullyQualifiedErrorId: PositionalParameterNotFound, Microsoft.PowerShell
.Commands.JoinPathCommand
J'ai essayé d'utiliser un tableau de chaînes:
[string[]] $pieces = "C:", "Program Files", "Microsoft Office"
$path = Join-Path $pieces
Write-Host $path
Mais PowerShell m'invite à entrer le chemin enfant (puisque je n'ai pas spécifié l' -childpath
argument), par exemple "somepath", puis crée trois chemins de fichiers,
C:\somepath
Program Files\somepath
Microsoft Office\somepath
ce qui n'est pas juste non plus.
la source
$PSVersionTable
)? Ça[io.path]::combine([string[]]('c:\','foo','bar'))
marche?join-path
fait ce que vous attendez,join-path "C:\" "\foo"
génèreC:\foo
,Path.Combine
mais ignore le premier argument chaque fois que le deuxième argument contient un séparateur de début:[io.path]::combine('c:\', '\foo')
affiche de manière ennuyeuse\foo
.Puisque Join-Path peut recevoir une valeur de chemin, vous pouvez diriger plusieurs instructions Join-Path ensemble:
Ce n'est pas aussi laconique que vous le souhaiteriez probablement, mais c'est entièrement PowerShell et est relativement facile à lire.
la source
Depuis PowerShell 6.0, Join-Path a un nouveau paramètre appelé
-AdditionalChildPath
et peut combiner plusieurs parties d'un chemin hors de la boîte . Soit en fournissant le paramètre supplémentaire, soit en fournissant simplement une liste d'éléments.Exemple de la documentation :
Donc dans PowerShell 6.0 et au-dessus de votre variante
fonctionne comme prévu!
la source
Join-Path n'est pas exactement ce que vous recherchez. Il a de multiples usages mais pas celui que vous recherchez. Un exemple de la fête avec Join-Path :
Vous voyez qu'il accepte un tableau de chaînes, et il concatène la chaîne enfant à chaque création de chemins complets. Dans votre exemple
$path = join-path C: "Program Files" "Microsoft Office"
,. Vous obtenez l'erreur car vous passez trois arguments de position etjoin-path
n'en acceptez que deux. Ce que vous recherchez, c'est un-join
, et je pourrais voir que c'est un malentendu. Considérez plutôt ceci avec votre exemple:-Join
prend le tableau d'éléments et les concatène avec\
en une seule chaîne.Petite tentative de sauvetage
Oui, je conviendrai que cette réponse est meilleure, mais la mienne pourrait encore fonctionner. Les commentaires suggèrent qu'il pourrait y avoir un problème avec les barres obliques, donc pour rester avec mon approche de concaténation, vous pouvez également le faire.
Donc, s'il y a des problèmes avec des barres obliques supplémentaires, cela peut être géré tant qu'ils ne sont pas au début de la chaîne (autorise les chemins UNC ).
[io.path]::combine('c:\', 'foo', '\bar\')
ne fonctionnerait pas comme prévu et le mien en serait responsable. Les deux nécessitent des chaînes appropriées pour l'entrée car vous ne pouvez pas tenir compte de tous les scénarios. Considérez les deux approches, mais, oui, l'autre réponse mieux notée est plus laconique, et je ne savais même pas qu'elle existait.De plus, je tiens à souligner que ma réponse explique en quoi ce que le PO a fait était mal en plus de fournir une suggestion pour résoudre le problème central.
la source
Si vous utilisez toujours .NET 2.0, vous
[IO.Path]::Combine
n'aurez pas laparams string[]
surcharge dont vous avez besoin pour joindre plus de deux parties, et vous verrez l'erreur Impossible de trouver une surcharge pour "Combine" et le nombre d'arguments: "3".Un peu moins élégant, mais une solution pure PowerShell consiste à agréger manuellement les parties de chemin:
ou
la source
Voici quelque chose qui fera ce que vous voudriez lorsque vous utilisez un tableau de chaînes pour ChildPath.
Quelles sorties
La seule mise en garde que j'ai trouvée est que la valeur initiale de $ path doit avoir une valeur (ne peut pas être nulle ou vide).
la source
Voici deux autres façons d'écrire une fonction PowerShell pure pour joindre un nombre arbitraire de composants dans un chemin.
Cette première fonction utilise un seul tableau pour stocker tous les composants, puis une boucle foreach pour les combiner:
Étant donné que les composants du chemin sont des éléments d'un tableau et font tous partie d'un seul argument, ils doivent être séparés par des virgules. L'utilisation est la suivante:
Une manière plus minimaliste d'écrire cette fonction consiste à utiliser la
$args
variable intégrée , puis à réduire la boucle foreach en une seule ligne en utilisant la méthode de Mike Fair.Contrairement à la version précédente de la fonction, chaque composant de chemin est un argument distinct, donc seul un espace est nécessaire pour séparer les arguments:
la source
L'approche suivante est plus concise que le piping d'instructions Join-Path:
$ p contient alors le chemin concaténé 'a \ b \ c \ d'.
(Je viens de remarquer que c'est exactement la même approche que celle de Mike Fair, désolé.)
la source
Ou vous pouvez écrire votre propre fonction (ce que j'ai fini par faire).
Vous pouvez alors appeler la fonction comme ceci:
Cela présente l'avantage d'avoir exactement le même comportement que la fonction Join-Path normale et ne dépend pas du .NET Framework.
la source
Vous pouvez l'utiliser de cette façon:
la source