Se eu quiser combinar duas strings em um caminho de arquivo, uso Join-Path
assim:
$path = Join-Path C: "Program Files"
Write-Host $path
Isso imprime "C:\Program Files"
. Se eu quiser fazer isso por mais de duas strings:
$path = Join-Path C: "Program Files" "Microsoft Office"
Write-Host $path
PowerShell gera um erro:
Join-Path: Não foi encontrado um parâmetro posicional que aceite o argumento 'Microsoft Office'.
Em D: \ users \ ma \ my_script.ps1: 1 char: 18
+ $ path = join-path <<<< C: "Arquivos de programas" "Microsoft Office"
+ CategoryInfo: InvalidArgument: (:) [Join-Path] , ParameterBindingException
+ FullyQualifiedErrorId: PositionalParameterNotFound, Microsoft.PowerShell
.Commands.JoinPathCommand
Tentei usar uma matriz de string:
[string[]] $pieces = "C:", "Program Files", "Microsoft Office"
$path = Join-Path $pieces
Write-Host $path
Mas o PowerShell me pede para inserir o childpath (já que não especifiquei o -childpath
argumento), por exemplo, "somepath", e então cria três caminhos de arquivos,
C:\somepath
Program Files\somepath
Microsoft Office\somepath
o que também não está certo.
fonte
$PSVersionTable
)? Funciona[io.path]::combine([string[]]('c:\','foo','bar'))
?join-path
faz o que você espera,join-path "C:\" "\foo"
gera resultadosC:\foo
,Path.Combine
porém ignora o primeiro argumento sempre que o segundo argumento contém um separador inicial:[io.path]::combine('c:\', '\foo')
saídas irritantes\foo
.Como o Join-Path pode ser canalizado para um valor de caminho, você pode canalizar várias instruções Join-Path juntas:
Não é tão conciso quanto você provavelmente gostaria que fosse, mas é totalmente PowerShell e é relativamente fácil de ler.
fonte
Desde o PowerShell 6.0, Join-Path tem um novo parâmetro chamado
-AdditionalChildPath
e pode combinar várias partes de um caminho pronto para uso . Fornecendo o parâmetro extra ou apenas fornecendo uma lista de elementos.Exemplo da documentação :
Portanto, no PowerShell 6.0 e acima, sua variante
funciona como esperado!
fonte
O Join-Path não é exatamente o que você está procurando. Tem múltiplos usos, mas não aquele que você procura. Um exemplo de Partying with Join-Path :
Você vê que ele aceita uma matriz de strings e concatena a string filho para cada um criando caminhos completos. No seu exemplo
$path = join-path C: "Program Files" "Microsoft Office"
,. Você está recebendo o erro porque está passando três argumentos posicionais ejoin-path
aceita apenas dois. O que você está procurando é um-join
, e posso ver que isso é um mal-entendido. Em vez disso, considere o seguinte com seu exemplo:-Join
pega a matriz de itens e os concatena\
em uma única string.Pequena tentativa de salvamento
Sim, concordo que essa resposta é melhor, mas a minha ainda pode funcionar. Os comentários sugerem que pode haver um problema com barras, portanto, para manter minha abordagem de concatenação, você também pode fazer isso.
Portanto, se houver problemas com barras extras, isso pode ser tratado, desde que não estejam no início da string (permite caminhos UNC ).
[io.path]::combine('c:\', 'foo', '\bar\')
não funcionaria como esperado e o meu seria responsável por isso. Ambos requerem cadeias de caracteres adequadas para entrada, pois você não pode levar em conta todos os cenários. Considere as duas abordagens, mas, sim, a outra resposta com classificação mais alta é mais concisa, e eu nem sabia que ela existia.Além disso, gostaria de salientar que minha resposta explica como o que o OP estava fazendo estava errado, além de fornecer uma sugestão para resolver o problema central.
fonte
Se você ainda estiver usando .NET 2.0,
[IO.Path]::Combine
não terá aparams string[]
sobrecarga necessária para unir mais de duas partes e verá o erro Não é possível encontrar uma sobrecarga para "Combinar" e a contagem de argumentos: "3".Um pouco menos elegante, mas uma solução pura do PowerShell é agregar manualmente as partes do caminho:
ou
fonte
Aqui está algo que fará o que você deseja ao usar uma matriz de string para o ChildPath.
Quais saídas
A única ressalva que descobri é que o valor inicial para $ path deve ter um valor (não pode ser nulo ou vazio).
fonte
Aqui estão mais duas maneiras de escrever uma função PowerShell pura para unir um número arbitrário de componentes em um caminho.
Esta primeira função usa uma única matriz para armazenar todos os componentes e, em seguida, um loop foreach para combiná-los:
Como os componentes do caminho são elementos em uma matriz e todos fazem parte de um único argumento, eles devem ser separados por vírgulas. O uso é o seguinte:
Uma maneira mais minimalista de escrever essa função é usar a
$args
variável embutida e, em seguida, recolher o loop foreach em uma única linha usando o método de Mike Fair.Ao contrário da versão anterior da função, cada componente do caminho é um argumento separado, portanto, apenas um espaço é necessário para separar os argumentos:
fonte
A abordagem a seguir é mais concisa do que a tubulação de instruções Join-Path:
$ p então contém o caminho concatenado 'a \ b \ c \ d'.
(Acabei de notar que esta é exatamente a mesma abordagem que a de Mike Fair, desculpe.)
fonte
Ou você pode escrever sua própria função para ele (que é o que acabei fazendo).
Você poderia então chamar a função assim:
Isso tem a vantagem de ter exatamente o mesmo comportamento da função Join-Path normal e não depender do .NET Framework.
fonte
Você pode usá-lo desta forma:
fonte