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.