如何使用连接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的初始值必须有一个值(不能为空或空)。