我需要檢查我的當前位置是否包含一個名為的目錄_framework,如果有,請將位置設定為該檔案夾。
問題是,我不知道關鍵字之前或關鍵字之后的路徑中是什么。
所以為了形象化,基本上如果我在這里:
C:\foo\bar\some\_framework\stuff\xy
我需要跳到這里:
C:\foo\bar\some\_framework
我寫了一個有效的代碼:
$CurrentPath = (Get-Location).Path
$SplitUp = $CurrentPath -split '\\'
$Result = @()
foreach ($Split in $SplitUp) {
$Result = $Split
if ($Split -eq '_framework') { break }
}
Set-Location ($Result -join '\')
但我覺得它非常丑陋。是否有一個簡單的 cmdlet 可以以更簡單的方式為我提供我想要的結果,而無需拆分和迭代結果 - 或者這是唯一的解決方案?
它必須在 PowerShell 5.1 中可用
uj5u.com熱心網友回復:
使用單個正則運算式-replace操作洗掉部分之后的任何內容\_framework\:
$currentPath = "$PWD"
if($currentPath -like '*\_framework\*'){
$frameworkPath = $currentPath -replace '(?<=\\_framework)\\.*'
Set-Location -LiteralPath $frameworkPath
} else {
throw 'not a valid path'
}
或者,創建一個小的實用程式函式來為您決議正確的父級(如果您愿意,可以用自己的實作替換下面的實作):
function Get-AncestralPathByName
{
param(
[string]$Name
)
$path = "$PWD"
while($path -and $path -notmatch "\\$([regex]::Escape($Name))\\?$"){
$path = Split-Path $path
}
return $path
}
現在呼叫站點的代碼變得非常簡單:
if($targetPath = Get-AncestralPathByName -Name '_framework'){
Set-Location $targetPath
} else {
throw 'could not resolve target path'
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/360781.html
