我想为powershell脚本中的文件路径生成一个字符串.我希望这在windows和mac中同时工作.
目前,代码被硬编码到类似路径的窗口("\" - > windows,"/" - > unix):
$templatep="$CoreRoot\templates\$serviceName"
我将其更改为:
$templatep= Join-Path $CoreRoot "templates" $serviceName
并且它在Mac中使用Powershell 6.0.但是它在我的带有Powershell 4的Windows服务器中不起作用.我必须做这样的事情:
$templatep= Join-Path $CoreRoot -ChildPath "templates" | Join-Path -ChildPath $serviceName
知道为什么这只是在我的Mac上工作吗?这是PowerShell 5还是6的新功能?我不喜欢必须管道多个Join-Paths.有一个更好的方法吗?
谢谢!
首先,使用.NET框架的变通方法:
[IO.Path]::Combine('a', 'b', 'c')
这a/b/c
在Unix和a\b\c
Windows上产生,并且方便地支持任意数量的路径组件.
注意:
此解决方法仅适用于文件系统路径,而Join-Path
设计用于任何PowerShell驱动程序提供程序的路径.
确保不是没有分量之外第一个开始与\
(Windows)或/
(UNIX),因为任何前述组件则忽略; 例如,在Windows上:
[IO.Path]::Combine('\a', '\b', 'c') # -> '\b\c' - '\a' is ignored(!)
请注意,Join-Path
并没有表现出这种行为; 看到我的这个答案的细节.
作为使用管道对调用进行排序的替代方法,您可以简单地使用(子表达式):Join-Path
(...)
Join-Path a (Join-Path b c) # -> 'a\b\c' (on Windows)
语法通过显示Join-Path -?
为Windows PowerShell中 v5.1.14393.693
(附带参数略):
Join-Path [-Path][-ChildPath] ...
基于这种语法,调用Join-Path a b c
应该导致语法错误,这确实会发生.
相比之下,PowerShell Core中显示的语法显示了一个额外的参数:
Join-Path [-Path][-ChildPath] [[-AdditionalChildPath] ]
它是一个附加-AdditionalChildPath
参数,它以一种收集所有剩余位置参数的方式声明ValueFromRemainingArguments
,这使得指定任意数量的子组件的工作变得有效,因此Join-Path a b c
确实可以工作.
不幸的是,似乎不太可能将此增强功能反向移植到Windows PowerShell.
请注意,即使[-Path]
是数组参数,其目的也不是接受单个输出路径的多个子路径组件,而是允许连接多个父子路径对; 例如:
$ Join-Path a,b c # same as: Join-Path -Path a,b -ChildPath c a\c b\c
最后,即使它可能不可取,但您通常可以将硬编码/
作为两个平台上的路径分隔符,因为许多Windows API函数以及PowerShell自己的cmdlet都可以接受\
并/
互换.
但是,并非所有实用程序都可能以这种方式运行,因此使用适合平台的分隔符通常更安全.
例如,以下在Windows上运行正常:
Get-Item c:/windows/system32 # same as: Get-Item c:\windows\system32