首页 > 解决方案 > powershell 命令加入路径

问题描述

  1. Join-Path 'abc' 'deg' '*' ---不起作用
  2. 连接路径 'abc' 'deg' | Join-Path -ChildPath '*' --- 有效
  3. 输出所需 abc\deg\*

要知道什么是这里的问题 1. ?

标签: powershell

解决方案


版本 7 之前的 PowerShell 中Join-Path只需要 2 个参数,其中 1st ( -Path) 可以是路径左侧的字符串数组,而 2nd ( -ChildPath) 是路径右侧的单个字符串。

你可以这样做,但我认为这不是你期望得到的

> Join-Path @('abc', 'deg') '*'
# abc\*
# deg\*

为了实现您想要的,您可以使用本机方法Path.Combine,它具有 3、4 和路径部分数组的重载。但是,如果您计划在 Windows 7 上运行超过 2 个部分,我建议您避免使用它,因为这些重载是在.net 4.0中引入的,而在.net 3.5或更低版本上,这将失败。

# Variant1
$result = [System.IO.Path]::Combine('abc', 'deg', '*')

# Variant2
$parts = @('abc', 'deg', '*')
$result = [System.IO.Path]::Combine([string[]]$parts)

# Variant3 supported in .net before 4.0
$result = [System.IO.Path]::Combine('abc', [System.IO.Path]::Combine('deg', '*'))
# [System] is omitted, because it is loaded already
$result = [IO.Path]::Combine('abc', [IO.Path]::Combine('deg', '*'))

# Variant 4 ..meh...
$result = [String]::Join([IO.Path]::DirectorySeparatorChar, @('abc', 'deg', '*'))
$result = @('abc', 'deg', '*') -join [IO.Path]::DirectorySeparatorChar

PowerShell 版本 7 及更高版本中Join-Path有额外的第三个参数-AdditionalChildPath,并且可以采用任意数量的参数。

# Short version based on positional args
> Join-Path 'abc' 'deg' '*' 'sub'
# abc\deg\*\sub

# Long version based on named args
Join-Path -Path 'abc' -ChildPath 'deg' -AdditionalChildPath @('*', 'sub')
# abc\deg\*\sub

推荐阅读