PowerShell使用Get-ChildItem未指定全路径无法正确定位目录的问题
PowerShell跨目录定位目标路径解决方案
问题原因
你之前使用的fes\.policy是相对路径,PowerShell执行命令时会默认将相对路径与当前工作目录拼接,所以仅当工作目录处于governance目录下时路径才合法,切换到其他子目录就会出现路径不存在的报错。
最优解决方案(通用适配任意子目录层级)
以governance目录作为固定锚点,从当前工作目录向上遍历自动定位锚点,再拼接目标路径,无需硬编码前缀:
# 从当前目录向上遍历找到governance锚点目录 $governanceRoot = $PWD.Path while ($governanceRoot -and (Split-Path $governanceRoot -Leaf) -ne 'governance') { $governanceRoot = Split-Path $governanceRoot -Parent } # 找不到锚点时抛出错误 if (-not $governanceRoot) { Write-Error "未找到governance目录,请确认当前执行路径属于governance目录的子目录" exit 1 } # 拼接目标路径并执行查询 $targetPath = Join-Path $governanceRoot "fes\.policy" Get-ChildItem -Path $targetPath -Recurse -Directory -Exclude ".*"
代码逻辑说明:
- 从当前工作目录开始逐级向上提取父目录,直到匹配到名为
governance的根锚点目录 - 加入异常判断避免找不到锚点时出现不可预期的错误
- 用锚点路径拼接目标目录
fes\.policy,不管你当前在governance下的哪一级子目录都能准确定位
简化方案(固定层级回退)
如果你能确定当前工作目录和governance目录的层级差,比如你经常在governance/src/Tests目录下执行命令,只需要回退2级,也可以直接写相对回退路径:
Get-ChildItem -Path ../../fes\.policy -Recurse -Directory -Exclude ".*"
注意:该方案仅适用于固定工作目录层级的场景,层级变化后需要调整
../的数量,通用性不如锚点定位方案。
内容的提问来源于stack exchange,提问作者Nadia Hansen
相关产品推荐
相关产品推荐

