Powershell'de Ebeveynin ana dizini nasıl alınır?


96

Bir değişkende depolanan bir dizine sahipsem şunu söyleyin:

$scriptPath = (Get-ScriptDirectory);

Şimdi dizin bulmak istiyoruz iki üst düzey .

Yapmanın güzel bir yoluna ihtiyacım var:

$parentPath = Split-Path -parent $scriptPath
$rootPath = Split-Path -parent $parentPath

Bir kod satırında rootPath'e ulaşabilir miyim?

Yanıtlar:


163

Bir dizinin versiyonu

get-item burada dost yardım eli.

(get-item $scriptPath ).parent.parent

Sadece dizeyi istiyorsan

(get-item $scriptPath ).parent.parent.FullName

Bir dosyanın sürümü

$scriptPathBir dosyayı işaret ederse Directory, önce onun üzerinde özelliği çağırmanız gerekir, böylece çağrı böyle görünür

(get-item $scriptPath).Directory.Parent.Parent.FullName

Açıklamalar
Bu yalnızca varsa çalışacaktır $scriptPath. Aksi takdirde Split-Pathcmdlet kullanmanız gerekir .


Dizin nesnesini döndüren harika @rerun, daha sonra yolu bir dizede döndürmek için komut nedir?
Mark Kadlec

12
.parentyalnızca dizin nesnelerinde çalışır. Bir dosyaya giden yolum varsa ve dosyanın bulunduğu dizinin (get-item $PathToFile ).Directory.parent
üstünü bulmak istersem

6
Bunun yalnızca $scriptPathvar olduğunda çalıştığını unutmayın . Aksi takdirde sadece kullanın Split-Path $scriptPath -parent.
orad

2
Diğer SO üyeleri tarafından daha görünür olması için cevabınıza @ Baodad yorumunun birleştirilmesini önerdim.
SOReader

34

Bunu şu şekilde çözdüm:

$RootPath = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent

$RootPath = Split-Path (Split-Path $PSScriptRoot)-ParentSplit-Path
jarrad_obrien

22

Bunu ters eğik çizgilerden bölebilir ve sadece büyük üst dizin adını elde etmek için negatif dizi indeksleme ile sondan sonuncuyu alabilirsin.

($scriptpath -split '\\')[-2]

Normal ifadede kaçmak için ters eğik çizgiyi ikiye katlamanız gerekir.

Yolun tamamını almak için:

($path -split '\\')[0..(($path -split '\\').count -2)] -join '\'

Ve bölünmüş yol parametrelerine bakıldığında, yolu boru hattı girdisi olarak alır, bu nedenle:

$rootpath = $scriptpath | split-path -parent | split-path -parent

Önce bu parametreleri kontrol etmeliydim.
mjolinor

12

Kullanabilirsiniz

(get-item $scriptPath).Directoryname

dize yolunu almak için veya Dizin türünü kullanmak istiyorsanız şunu kullanın:

(get-item $scriptPath).Directory

5

PowerShell 3'te $PsScriptRootveya iki ebeveynle ilgili sorunuz için,

$dir = ls "$PsScriptRoot\..\.."

5

split-pathİhtiyaç duyduğunuz kadarını zincirleyebilirsiniz :

$rootPath = $scriptPath | split-path | split-path


2

Diğer cevaplar üzerinde biraz tahmin yapmak için (mümkün olduğunca Başlangıç ​​dostu bir şekilde):

  • Geçerli yollara işaret eden dize nesneleri, Get-Item ve Get-ChildItem gibi işlevler aracılığıyla DirectoryInfo / FileInfo nesnelerine dönüştürülebilir.
  • .Parent yalnızca bir DirectoryInfo nesnesinde kullanılabilir.
  • .Directory, FileInfo nesnesini bir DirectoryInfo nesnesine dönüştürür ve başka herhangi bir türde (hatta başka bir DirectoryInfo nesnesinde) kullanılırsa null döndürür.
  • .DirectoryName, bir FileInfo nesnesini bir String nesnesine dönüştürür ve başka herhangi bir türde (hatta başka bir String nesnesinde) kullanılırsa null döndürür.
  • .FullName, bir DirectoryInfo / FileInfo nesnesini bir String nesnesine dönüştürür ve başka herhangi bir türde (hatta başka bir DirectoryInfo / FileInfo nesnesi) kullanılıyorsa null döndürür.

Ne ile çalıştığınızı görmek için GetType Yöntemiyle nesne türünü kontrol edin: $scriptPath.GetType()

Son olarak, tek gisatırlık oluşturmaya yardımcı olan hızlı bir ipucu: Get-Item diğer ada sahiptir ve Get-ChildItem gcidiğer ada sahiptir .


0

$ PSScriptRoot kullanmak istiyorsanız şunları yapabilirsiniz:

Join-Path -Path $PSScriptRoot -ChildPath ..\.. -Resolve

0

Powershell'de:

$this_script_path = $(Get-Item $($MyInvocation.MyCommand.Path)).DirectoryName

$parent_folder = Split-Path $this_script_path -Leaf
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.