PowerShell脚本如何更高效获取项目APP根目录路径
PowerShell获取固定层级上级目录的优化方案
你当前连续调用Split-Path的实现逻辑正确,但可以从简洁度、可靠性、执行效率三个维度优化,不需要手动定义多层中间变量,也不建议把脚本路径存在全局变量中。
推荐写法(适配PowerShell 3.0及以上版本,覆盖绝大多数使用场景)
PowerShell内置了两个自动变量可以直接取脚本相关路径,不需要手动解析$MyInvocation对象:
$PSScriptRoot:自动返回当前执行脚本所在的目录路径,对应你场景里的APP/Tools目录$PSCommandPath:自动返回当前执行脚本的完整文件路径,和你写的$MyInvocation.MyCommand.Path效果完全一致
直接调用.NET底层的目录方法链式获取上级目录,比多次调用Split-Path cmdlet执行效率更高,代码也更简洁:
function Get-ProjectRoot { # 直接取脚本所在目录(Tools层)的父级,即为APP目录 $appRoot = [IO.Directory]::GetParent($PSScriptRoot).FullName # 再取APP目录的父级即为Base目录 $baseRoot = [IO.Directory]::GetParent($appRoot).FullName return $appRoot, $baseRoot } $Root, $Base = Get-ProjectRoot
兼容写法(适配PowerShell 2.0老环境)
如果需要兼容已经停止支持的PowerShell 2.0环境,可以把路径获取逻辑放在函数内部,避免全局变量带来的引用错误,简化嵌套写法即可:
function Root { $scriptPath = $MyInvocation.MyCommand.Path $toolsDir = Split-Path -Parent $scriptPath $appRoot = Split-Path -Parent $toolsDir $baseRoot = Split-Path -Parent $appRoot return $appRoot, $baseRoot } $Root, $Base = Root
注意:不要把脚本路径的赋值逻辑写在函数外部的全局作用域,当函数被其他脚本点源引入调用时,全局变量存储的路径会和实际调用路径不匹配,导致取值错误。
内容的提问来源于stack exchange,提问作者I am Jakoby
相关产品推荐
相关产品推荐

