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?

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.


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

$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

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

5

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

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

5

Anda cukup merantai sebanyak yang split-pathAnda butuhkan:

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


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.


0

Jika Anda ingin menggunakan $ PSScriptRoot, Anda dapat melakukannya

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

0

Di PowerShell:

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

$parent_folder = Split-Path $this_script_path -Leaf
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.