Si quiero combinar dos cadenas en una ruta de archivo, uso Join-Path
así:
$path = Join-Path C: "Program Files"
Write-Host $path
Eso imprime "C:\Program Files"
. Sin embargo, si quiero hacer esto por más de dos cadenas:
$path = Join-Path C: "Program Files" "Microsoft Office"
Write-Host $path
PowerShell arroja un error:
Join-Path: no se puede encontrar un parámetro posicional que acepte el argumento 'Microsoft Office'.
En D: \ users \ ma \ my_script.ps1: 1 char: 18
+ $ path = join-path <<<< C: "Archivos de programa" "Microsoft Office"
+ CategoryInfo: InvalidArgument: (:) [Join-Path] , ParameterBindingException
+ FullyQualifiedErrorId: PositionalParameterNotFound, Microsoft.PowerShell
.Commands.JoinPathCommand
Intenté usar una matriz de cadenas:
[string[]] $pieces = "C:", "Program Files", "Microsoft Office"
$path = Join-Path $pieces
Write-Host $path
Pero PowerShell me pide que ingrese el childpath (ya que no especifiqué el -childpath
argumento), por ejemplo, "somepath", y luego crea tres rutas de archivos,
C:\somepath
Program Files\somepath
Microsoft Office\somepath
lo cual tampoco está bien.
fuente
$PSVersionTable
)? ¿[io.path]::combine([string[]]('c:\','foo','bar'))
Funciona?join-path
hace lo que espera,join-path "C:\" "\foo"
salidasC:\foo
,Path.Combine
sin embargo ignora el primer argumento siempre que el segundo argumento contiene un separador inicial:[io.path]::combine('c:\', '\foo')
salidas molestas\foo
.Dado que Join-Path puede canalizar un valor de ruta, puede canalizar varias declaraciones Join-Path juntas:
No es tan conciso como probablemente le gustaría que fuera, pero es completamente PowerShell y es relativamente fácil de leer.
fuente
Desde PowerShell 6.0, Join-Path tiene un nuevo parámetro llamado
-AdditionalChildPath
y puede combinar varias partes de una ruta de forma inmediata . O proporcionando el parámetro adicional o simplemente proporcionando una lista de elementos.Ejemplo de la documentación :
Entonces, en PowerShell 6.0 y superior, su variante
funciona como se esperaba!
fuente
Join-Path no es exactamente lo que está buscando. Tiene múltiples usos pero no el que estás buscando. Un ejemplo de Partying with Join-Path :
Verá que acepta una matriz de cadenas y concatena la cadena secundaria a cada una de las cuales crea rutas completas. En su ejemplo
$path = join-path C: "Program Files" "Microsoft Office"
,. Obtiene el error ya que está pasando tres argumentos posicionales yjoin-path
solo acepta dos. Lo que está buscando es un-join
, y puedo ver que se trata de un malentendido. En cambio, considere esto con su ejemplo:-Join
toma la matriz de elementos y los concatena\
en una sola cadena.Intento menor de salvamento
Sí, estaré de acuerdo en que esta respuesta es mejor, pero la mía aún podría funcionar. Los comentarios sugieren que podría haber un problema con las barras, por lo que para seguir con mi enfoque de concatenación, también podría hacer esto.
Entonces, si hay problemas con barras diagonales adicionales, se podría manejar siempre que no estén al principio de la cadena (permite rutas UNC ).
[io.path]::combine('c:\', 'foo', '\bar\')
no funcionaría como se esperaba y el mío lo explicaría. Ambos requieren cadenas adecuadas para la entrada, ya que no puede tener en cuenta todos los escenarios. Considere ambos enfoques, pero, sí, la otra respuesta de mayor calificación es más concisa y ni siquiera sabía que existía.Además, me gustaría señalar que mi respuesta explica cómo lo que hizo el OP estuvo mal además de proporcionar una sugerencia para abordar el problema central.
fuente
Si todavía está utilizando .NET 2.0,
[IO.Path]::Combine
no tendrá laparams string[]
sobrecarga que necesita para unir más de dos partes, y verá el error No se puede encontrar una sobrecarga para "Combinar" y el recuento de argumentos: "3".Un poco menos elegante, pero una solución pura de PowerShell es agregar manualmente partes de la ruta:
o
fuente
Aquí hay algo que hará lo que desearía cuando use una matriz de cadenas para ChildPath.
Que salidas
La única advertencia que encontré es que el valor inicial de $ path debe tener un valor (no puede ser nulo o vacío).
fuente
Aquí hay dos formas más de escribir una función pura de PowerShell para unir un número arbitrario de componentes en una ruta.
Esta primera función usa una única matriz para almacenar todos los componentes y luego un bucle foreach para combinarlos:
Dado que los componentes de la ruta son elementos de una matriz y todos forman parte de un único argumento, deben estar separados por comas. El uso es el siguiente:
Una forma más minimalista de escribir esta función es usar la
$args
variable incorporada y luego contraer el bucle foreach en una sola línea usando el método de Mike Fair.A diferencia de la versión anterior de la función, cada componente de ruta es un argumento separado, por lo que solo se necesita un espacio para separar los argumentos:
fuente
El siguiente enfoque es más conciso que canalizar declaraciones Join-Path:
$ p luego contiene la ruta concatenada 'a \ b \ c \ d'.
(Acabo de notar que este es exactamente el mismo enfoque que el de Mike Fair, lo siento).
fuente
O podría escribir su propia función para ello (que es lo que terminé haciendo).
A continuación, puede llamar a la función de esta manera:
Esto tiene la ventaja de tener exactamente el mismo comportamiento que la función Join-Path normal y no depende de .NET Framework.
fuente
Puedes usarlo de esta manera:
fuente