当前位置:  开发笔记 > 运维 > 正文

Powershell在Windows和unix中正确生成文件路径

如何解决《Powershell在Windows和unix中正确生成文件路径》经验,为你挑选了1个好方法。

我想为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.有一个更好的方法吗?

谢谢!



1> mklement0..:

首先,使用.NET框架的变通方法:

[IO.Path]::Combine('a', 'b', 'c')

a/b/c在Unix和a\b\cWindows上产生,并且方便地支持任意数量的路径组件.

注意:

此解决方法仅适用于文件系统路径,而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

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有