如何使用连接path将两个以上的string合并到文件path中?

如果我想把两个string合并成一个文件path,我使用如下的join-path

 $path = join-path C: "Program Files" write-host $path 

这打印C:\Program Files" 。如果我想这样做超过两个string:

 $path = join-path C: "Program Files" "Microsoft Office" write-host $path 

Powershell引发错误:

 Join-Path : A positional parameter cannot be found that accepts argument 'Micro soft Office'. At D:\users\ma\my_script.ps1:1 char:18 + $path = join-path <<<< C: "Program Files" "Microsoft Office" + CategoryInfo : InvalidArgument: (:) [Join-Path], ParameterBindi ngException + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell .Commands.JoinPathCommand 

我尝试使用一个string数组:

 [string[]] $pieces = "C:", "Program Files", "Microsoft Office" $path = join-path $pieces write-host $path 

但是Powershell会提示我inputchildpath(因为我没有指定-childpath参数),例如“somepath”,然后创build三个文件path,

 C:\somepath Program Files\somepath Microsoft Office\somepath 

这也是不正确的。

您可以使用.NETpath类:

 [io.path]::combine('c:\', 'foo', 'bar') 

由于Join-Path可以传递path值,因此可以将多个Join-Path语句连接在一起:

 Join-Path "C:" -ChildPath "Windows" | Join-Path -ChildPath "system32" | Join-Path -ChildPath "drivers" 

它不像你可能会喜欢的那样简洁,但它完全是Powershell,相对容易阅读

joinpath不完全是你在找什么。 它有多种用途,但不是你正在寻找的。 joinpath聚会的一个例子

 Join-Path C:\hello,d:\goodbye,e:\hola,f:\adios world C:\hello\world d:\goodbye\world e:\hola\world f:\adios\world 

您会看到它接受一个string数组,并将子string连接到每个创build完整path。 在你的例子中$path = join-path C: "Program Files" "Microsoft Office" 。 你正在传递错误,因为你正在传递3个位置参数,而join-path只接受2个。你在寻找的是一个join,我可以看到这是一个误解。 用你的例子来考虑一下:

 "C:","Program Files","Microsoft Office" -join "\" 

-Join获取项目数组并将它们与\连接成单个string。

 C:\Program Files\Microsoft Office 

小小的企图打捞

是的,我会同意这个答案更好,但我的工作仍然可以。 意见build议可能有斜线问题,以保持我的连接方法,你也可以做到这一点。

 "C:","\\Program Files\","Microsoft Office\" -join "\" -replace "(?!^\\)\\{2,}","\" 

所以如果有额外斜杠的问题,只要它们不在string的开头(允许UNCpath)就可以处理。 [io.path]::combine('c:\', 'foo', '\bar\')将无法按预期工作,我会考虑这一点。 两者都需要适当的stringinput,因为您不能考虑所有情况。 考虑这两种方法,但是是另一个较高的评价答案是更简洁,我甚至不知道它的存在。

另外,想指出的是,我的答案解释了OP如何解决核心问题提出了一个build议。

如果你仍然使用.Net 2.0那么[IO.Path]::Combine将不会有params string[]重载,你需要join两个以上的部分,你会看到错误无法find“Combine”和参数计数:“3”。

稍微不太优雅但纯粹的Powershell解决scheme是手动聚合path部分:

 join-path C: (join-path "Program Files" "Microsoft Office") 

要么

 join-path (join-path C: "Program Files") "Microsoft Office" 

这里的东西,将做你想为ChildPath使用一个string数组。

 $path = "C:" @( "Program Files", "Microsoft Office" ) | %{ $path = Join-Path $path $_ } Write-Host $path 

哪个输出

 C:\Program Files\Microsoft Office 

我发现唯一的警告是,$path的初始值必须有一个值(不能为空或空)。