จะรับไดเร็กทอรีหลักของ Parent ใน Powershell ได้อย่างไร?


96

ดังนั้นหากฉันมีไดเร็กทอรีที่เก็บไว้ในตัวแปรให้พูดว่า:

$scriptPath = (Get-ScriptDirectory);

ตอนนี้ฉันต้องการค้นหาไดเรกทอรีสองระดับขึ้นไป

ฉันต้องการวิธีที่ดีในการทำ:

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

ฉันจะไปที่ rootPath ในโค้ดบรรทัดเดียวได้หรือไม่

คำตอบ:


163

เวอร์ชันสำหรับไดเร็กทอรี

get-item เป็นมือช่วยเหลือที่เป็นมิตรของคุณที่นี่

(get-item $scriptPath ).parent.parent

หากคุณต้องการสตริงเท่านั้น

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

เวอร์ชันสำหรับไฟล์

หาก$scriptPathชี้ไปที่ไฟล์คุณต้องเรียกDirectoryคุณสมบัติก่อนดังนั้นการเรียกจะมีลักษณะเช่นนี้

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

หมายเหตุ
สิ่งนี้จะใช้ได้เฉพาะเมื่อ$scriptPathมีอยู่ มิฉะนั้นคุณต้องใช้Split-Pathcmdlet


Awesome @rerun ที่ส่งคืนวัตถุไดเร็กทอรีคำสั่งในการส่งคืนเส้นทางในสตริงคืออะไร?
Mark Kadlec

12
.parentใช้ได้กับวัตถุไดเรกทอรีเท่านั้น หากฉันมีเส้นทางไปยังไฟล์และฉันต้องการค้นหาพาเรนต์ของไดเร็กทอรีที่มีไฟล์อยู่ฉันต้องใช้(get-item $PathToFile ).Directory.parent
Baodad

6
โปรดทราบว่าสิ่งนี้ใช้ได้เฉพาะเมื่อ$scriptPathมีอยู่ อย่างอื่นก็ใช้Split-Path $scriptPath -parent.
orad

2
ฉันได้เสนอการรวมความคิดเห็นของ @Baodad ไว้ในคำตอบของคุณเพื่อให้สมาชิกคนอื่น ๆ ของ SO มองเห็นได้มากขึ้น
SOReader

34

ฉันได้แก้ไขแล้วดังนี้:

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

$RootPath = Split-Path (Split-Path $PSScriptRoot)ยังใช้งานได้เนื่องจาก-Parentเป็นพารามิเตอร์การแบ่งตำแหน่งเริ่มต้นสำหรับSplit-Path
jarrad_obrien

22

คุณสามารถแบ่งมันที่แบ็กสแลชและใช้อันถัดไปสุดท้ายด้วยการสร้างดัชนีอาร์เรย์เชิงลบเพื่อให้ได้ชื่อไดเร็กทอรีปู่ย่าตายายเท่านั้น

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

คุณต้องเพิ่มแบ็กสแลชเป็นสองเท่าเพื่อหลีกเลี่ยงมันในนิพจน์ทั่วไป

เพื่อรับเส้นทางทั้งหมด:

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

และเมื่อดูพารามิเตอร์สำหรับแยกพา ธ จะใช้พา ธ เป็นอินพุตไปป์ไลน์ดังนั้น:

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

ควรมีการตรวจสอบพารามิเตอร์เหล่านั้นก่อน
mjolinor

12

คุณสามารถใช้ได้

(get-item $scriptPath).Directoryname

เพื่อรับเส้นทางสตริงหรือถ้าคุณต้องการให้ประเภท Directory ใช้:

(get-item $scriptPath).Directory




2

หากต้องการคาดการณ์คำตอบอื่น ๆ เล็กน้อย (ในแบบที่เป็นมิตรกับผู้เริ่มต้นใช้งานให้มากที่สุด):

  • อ็อบเจ็กต์สตริงที่ชี้ไปยังพา ธ ที่ถูกต้องสามารถแปลงเป็นอ็อบเจ็กต์ DirectoryInfo / FileInfo ผ่านฟังก์ชันเช่น Get-Item และ Get-ChildItem
  • .Parent สามารถใช้ได้กับอ็อบเจ็กต์ DirectoryInfo เท่านั้น
  • . ไดเร็กทอรีแปลงอ็อบเจ็กต์ FileInfo เป็นอ็อบเจ็กต์ DirectoryInfo และจะคืนค่า null หากใช้กับประเภทอื่น ๆ (แม้แต่อ็อบเจ็กต์ DirectoryInfo อื่น)
  • .DirectoryName แปลงอ็อบเจ็กต์ FileInfo เป็นอ็อบเจกต์ String และจะคืนค่า null หากใช้กับประเภทอื่น ๆ (แม้แต่อ็อบเจ็กต์ String อื่น)
  • .FullName แปลงอ็อบเจ็กต์ DirectoryInfo / FileInfo เป็นอ็อบเจ็กต์ String และจะคืนค่า null หากใช้กับประเภทอื่น ๆ (แม้แต่อ็อบเจ็กต์ DirectoryInfo / FileInfo อื่น)

ตรวจสอบประเภทวัตถุด้วย GetType Method เพื่อดูว่าคุณกำลังทำงานกับอะไร: $scriptPath.GetType()

สุดท้ายเคล็ดลับสั้น ๆ ที่ช่วยในการสร้าง one-liners: Get-Item มีgiนามแฝงและ Get-ChildItem มีgciนามแฝง


0

หากคุณต้องการใช้ $ PSScriptRoot คุณสามารถทำได้

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.