Test-Path 是不是接受相对路径?
Posted
技术标签:
【中文标题】Test-Path 是不是接受相对路径?【英文标题】:Does Test-Path accept Relative Paths?Test-Path 是否接受相对路径? 【发布时间】:2021-12-23 08:46:52 【问题描述】:使用Test-Path
cmdlet 时,相对路径似乎可以工作,但我找不到任何支持这一点的官方文档。
如果它们受支持:
它们是否在 Powershell 2.0 中工作? 它们相对是哪个路径? 脚本路径?执行路径?其他地方? 如何更改根相对路径? (例如其他东西的脚本路径)我有限的测试表明它与脚本路径(脚本所在的文件夹)有关。总是这样吗?如果是这样,那么我可以可靠地使用Join-Path
来更改该路径。
【问题讨论】:
在 PoSh 中,相对路径是相对于 PoSh 认为是当前位置的位置。这可以是脚本开始的位置,脚本开始时操作系统当前位置的位置,或者脚本设置当前位置的位置。 ///// 与所有脚本或编程语言一样...如果可以避免,请不要使用相对路径。_ 歧义是危险的。 我建议查看以下有关 PATH 语法的文档。这些文件似乎没有回到 2.0,至少我可以很快找到。 docs.microsoft.com/en-us/powershell/module/… 至于“当前工作地点”,查看文档。 docs.microsoft.com/en-us/powershell/module/… 最安全的方法是使用$PSScriptRoot
等自动变量。
【参考方案1】:
是的,Test-Path
接受相对路径。
正如典型,相对路径被解释为相对于会话的当前location,这反映在automatic $PWD
variable并在Get-Location
的输出中。
当前位置也可以表示为.
请注意,虽然位置通常是文件系统目录,但 PowerShell 的 provider model 也允许以类似文件系统的方式呈现其他数据存储,例如 Windows 上的注册表,例如(驱动器HKCU:
和HKLM:
)
因此,以下命令是等价的:
# Test if an item named 'foo' exists in the current location.
# If the current location is a *file-system* location, this
# could be either a file or a directory.
# Add:
# -PathType Container to test only for a directory (container item)
# -PathType Leaf to test only for a file (leaf item)
Test-Path foo
Test-Path .\foo
Test-Path (Join-Path $PWD foo)
正如Lee Dailey 所说,在 scripts 中最好使用 full 路径 - 除非您事先仔细控制当前位置,但请注意更改当前位置(使用Set-Location
或Push-Location
)会更改它会话范围,因此最好在退出脚本之前恢复之前的位置,您可以通过配对@ 987654341@ / Pop-Location
来电。
相比之下,如果您需要测试相对于您的脚本位置的路径,请使用automatic $PSScriptRoot
variable,正如Santiago Squarzon 建议的那样: p>
# Test if a file or directory named 'foo' exists in the directory
# in which the enclosing script is located.
Test-Path (Join-Path $PSScriptRoot foo)
【讨论】:
以上是关于Test-Path 是不是接受相对路径?的主要内容,如果未能解决你的问题,请参考以下文章