Итак, если у меня есть каталог, хранящийся в переменной, скажем:
$scriptPath = (Get-ScriptDirectory);
Теперь я хотел бы найти каталог двумя родительскими уровнями выше.
Мне нужен хороший способ:
$parentPath = Split-Path -parent $scriptPath
$rootPath = Split-Path -parent $parentPath
Могу ли я добраться до rootPath одной строкой кода?
powershell
scripting
Марк Кадлец
источник
источник
.parent
работает только с объектами каталога. Если у меня есть путь к файлу, и я хочу найти родительский каталог, в котором находится файл, мне нужно использовать(get-item $PathToFile ).Directory.parent
$scriptPath
существует. В противном случае просто используйтеSplit-Path $scriptPath -parent
.Я решил это так:
$RootPath = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent
источник
$RootPath = Split-Path (Split-Path $PSScriptRoot)
также работает, поскольку-Parent
это параметр разделения местоположения по умолчанию дляSplit-Path
Вы можете разделить его на обратную косую черту и взять предпоследний с отрицательной индексацией массива, чтобы получить только имя родительского каталога.
($scriptpath -split '\\')[-2]
Вы должны удвоить обратную косую черту, чтобы избежать ее в регулярном выражении.
Чтобы получить весь путь:
($path -split '\\')[0..(($path -split '\\').count -2)] -join '\'
И, глядя на параметры для split-path, он принимает путь как входной конвейер, поэтому:
$rootpath = $scriptpath | split-path -parent | split-path -parent
источник
Ты можешь использовать
(get-item $scriptPath).Directoryname
чтобы получить строковый путь или если вы хотите использовать тип каталога:
(get-item $scriptPath).Directory
источник
В PowerShell 3
$PsScriptRoot
или на ваш вопрос о двух родителях:$dir = ls "$PsScriptRoot\..\.."
источник
Вы можете просто связать столько
split-path
сколько вам нужно:$rootPath = $scriptPath | split-path | split-path
источник
источник
Чтобы немного экстраполировать другие ответы (насколько это возможно для начинающих):
Проверьте тип объекта с помощью метода GetType, чтобы узнать, с чем вы работаете:
$scriptPath.GetType()
И, наконец, небольшой совет, который поможет с однострочником: Get-Item имеет
gi
псевдоним, а Get-ChildItem -gci
псевдоним.источник
Если вы хотите использовать $ PSScriptRoot, вы можете сделать
Join-Path -Path $PSScriptRoot -ChildPath ..\.. -Resolve
источник
В PowerShell:
$this_script_path = $(Get-Item $($MyInvocation.MyCommand.Path)).DirectoryName $parent_folder = Split-Path $this_script_path -Leaf
источник