Bagaimana cara mendapatkan direktori induk di Powershell?

96

Jadi jika saya memiliki direktori yang disimpan dalam variabel, katakan:

$scriptPath = (Get-ScriptDirectory);

Sekarang saya ingin mencari direktori dua tingkat induk.

Saya butuh cara yang bagus untuk melakukannya:

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

Bisakah saya mengakses rootPath dalam satu baris kode?

Mark Kadlec
sumber

Jawaban:

163

Versi untuk direktori

get-item adalah uluran tangan ramah Anda di sini.

(get-item $scriptPath ).parent.parent

Jika Anda menginginkan string saja

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

Versi file

Jika $scriptPathmenunjuk ke sebuah file maka Anda harus memanggil Directoryproperti terlebih dahulu, sehingga panggilannya akan terlihat seperti ini

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

Keterangan
Ini hanya akan bekerja jika $scriptPathada. Jika tidak, Anda harus menggunakan Split-Pathcmdlet.

memutarkan lagi
sumber
Awesome @rerun, yang mengembalikan objek direktori, apa perintah untuk mengembalikan jalur dalam string?
Mark Kadlec
12
.parenthanya bekerja pada objek direktori. Jika saya memiliki jalur ke file, dan saya ingin menemukan induk dari direktori tempat file itu berada, saya perlu menggunakan(get-item $PathToFile ).Directory.parent
Baodad
6
Perhatikan bahwa ini hanya berfungsi jika $scriptPathada. Jika tidak, gunakan saja Split-Path $scriptPath -parent.
orad
2
Saya telah mengusulkan penggabungan komentar @Baodad ke dalam jawaban Anda sehingga lebih terlihat oleh anggota SO lainnya.
SOReader
34

Saya telah menyelesaikannya seperti ini:

$RootPath = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent
Matthias König
sumber
$RootPath = Split-Path (Split-Path $PSScriptRoot)juga berfungsi karena -Parentmerupakan parameter pembagian lokasi default untukSplit-Path
jarrad_obrien
22

Anda dapat membaginya di garis miring terbalik, dan mengambil yang berikutnya-ke-terakhir dengan pengindeksan array negatif untuk mendapatkan nama direktori grandparent saja.

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

Anda harus menggandakan garis miring terbalik untuk menghindarinya di ekspresi reguler.

Untuk mendapatkan seluruh jalur:

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

Dan, melihat parameter untuk jalur terbagi, jalur tersebut diambil sebagai masukan pipeline, jadi:

$rootpath = $scriptpath | split-path -parent | split-path -parent
mjolinor.dll
sumber
Harus memeriksa parameter tersebut terlebih dahulu.
mjolinor
12

Kamu bisa memakai

(get-item $scriptPath).Directoryname

untuk mendapatkan jalur string atau jika Anda ingin tipe Direktori gunakan:

(get-item $scriptPath).Directory
mithun_daa
sumber
5

Di PowerShell 3, $PsScriptRootatau untuk pertanyaan Anda tentang dua orang tua,

$dir = ls "$PsScriptRoot\..\.."
Jon Davis
sumber
5

Anda cukup merantai sebanyak yang split-pathAnda butuhkan:

$rootPath = $scriptPath | split-path | split-path
bijak
sumber
2
Split-Path -Path (Get-Location).Path -Parent
Emrah Saglam
sumber
2

Untuk mengekstrapolasi sedikit tentang jawaban lain (dengan cara yang ramah Pemula mungkin):

  • Objek string yang mengarah ke jalur yang valid dapat dikonversi ke objek DirectoryInfo / FileInfo melalui fungsi seperti Get-Item dan Get-ChildItem.
  • .Parent hanya dapat digunakan pada objek DirectoryInfo.
  • .Directory mengubah objek FileInfo menjadi objek DirectoryInfo, dan akan mengembalikan null jika digunakan pada jenis lain (bahkan objek DirectoryInfo lain).
  • .DirectoryName mengonversi objek FileInfo menjadi objek String, dan akan mengembalikan null jika digunakan pada jenis lain (bahkan objek String lain).
  • .FullName mengonversi objek DirectoryInfo / FileInfo menjadi objek String, dan akan mengembalikan null jika digunakan pada jenis lain (bahkan objek DirectoryInfo / FileInfo lain).

Periksa tipe objek dengan Metode GetType untuk melihat apa yang Anda kerjakan: $scriptPath.GetType()

Terakhir, tip cepat yang membantu membuat satu baris: Get-Item memiliki gialias dan Get-ChildItem memiliki gcialias.

Vopel
sumber
0

Jika Anda ingin menggunakan $ PSScriptRoot, Anda dapat melakukannya

Join-Path -Path $PSScriptRoot -ChildPath ..\.. -Resolve
dzolnjan.dll
sumber
0

Di PowerShell:

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

$parent_folder = Split-Path $this_script_path -Leaf
6stem.com
sumber