Làm cách nào để lấy thư mục mẹ của Parent trong Powershell?


95

Vì vậy, nếu tôi có một thư mục được lưu trữ trong một biến, hãy nói:

$scriptPath = (Get-ScriptDirectory);

Bây giờ tôi muốn tìm thư mục hai cấp cha mẹ.

Tôi cần một cách tốt để làm:

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

Tôi có thể truy cập rootPath trong một dòng mã không?

Câu trả lời:


163

Phiên bản cho một thư mục

get-item là bàn tay giúp đỡ thân thiện của bạn ở đây.

(get-item $scriptPath ).parent.parent

Nếu bạn muốn chuỗi chỉ

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

Phiên bản cho một tệp

Nếu $scriptPathtrỏ đến một tệp thì trước tiên bạn phải gọi thuộc Directorytính trên tệp đó, vì vậy lệnh gọi sẽ giống như thế này

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

Nhận xét
Điều này sẽ chỉ hoạt động nếu $scriptPathtồn tại. Nếu không, bạn phải sử dụng Split-Pathlệnh ghép ngắn.


@Rerun tuyệt vời, trả về đối tượng thư mục, lệnh trả về đường dẫn trong một chuỗi là gì?
Mark Kadlec

12
.parentchỉ hoạt động trên các đối tượng thư mục. Nếu tôi có một đường dẫn đến một tập tin, và tôi muốn tìm cha mẹ của thư mục mà tập tin là trong, tôi cần phải sử dụng(get-item $PathToFile ).Directory.parent
Baodad

6
Lưu ý rằng điều này chỉ hoạt động khi $scriptPathtồn tại. Nếu không chỉ cần sử dụng Split-Path $scriptPath -parent.
orad

2
Tôi đã đề xuất hợp nhất nhận xét @Baodad vào câu trả lời của bạn để các thành viên khác của SO thấy rõ hơn.
SOReader

34

Tôi đã giải quyết nó như thế này:

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

$RootPath = Split-Path (Split-Path $PSScriptRoot)cũng làm việc kể từ khi -Parentlà mặc định tham số vị trí chia choSplit-Path
jarrad_obrien

21

Bạn có thể tách nó ở dấu gạch chéo ngược và lấy từ tiếp theo đến cuối cùng với lập chỉ mục mảng phủ định để chỉ lấy tên thư mục ông bà.

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

Bạn phải tăng gấp đôi dấu gạch chéo ngược để thoát khỏi nó trong regex.

Để có được toàn bộ đường dẫn:

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

Và, xem xét các tham số cho đường dẫn tách, nó lấy đường dẫn làm đầu vào đường dẫn, vì vậy:

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

Nên đã kiểm tra các thông số đó trước.
mjolinor

12

Bạn có thể dùng

(get-item $scriptPath).Directoryname

để lấy đường dẫn chuỗi hoặc nếu bạn muốn kiểu Thư mục, hãy sử dụng:

(get-item $scriptPath).Directory

5

Trong PowerShell 3, $PsScriptRoothoặc đối với câu hỏi của bạn về hai bậc cha mẹ,

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

5

Bạn chỉ cần xâu chuỗi bao nhiêu split-pathtùy thích:

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


2

Để ngoại suy một chút về các câu trả lời khác (theo cách thân thiện với người mới bắt đầu nhất có thể):

  • Các đối tượng chuỗi trỏ đến đường dẫn hợp lệ có thể được chuyển đổi thành các đối tượng DirectoryInfo / FileInfo thông qua các chức năng như Get-Item và Get-ChildItem.
  • .Parent chỉ có thể được sử dụng trên một đối tượng DirectoryInfo.
  • .Directory chuyển đổi đối tượng FileInfo thành đối tượng DirectoryInfo và sẽ trả về null nếu được sử dụng trên bất kỳ kiểu nào khác (ngay cả đối tượng DirectoryInfo khác).
  • .DirectoryName chuyển đổi một đối tượng FileInfo thành một đối tượng String và sẽ trả về null nếu được sử dụng trên bất kỳ kiểu nào khác (ngay cả đối tượng String khác).
  • .FullName chuyển đổi đối tượng DirectoryInfo / FileInfo thành đối tượng String và sẽ trả về null nếu được sử dụng trên bất kỳ kiểu nào khác (ngay cả đối tượng DirectoryInfo / FileInfo khác).

Kiểm tra loại đối tượng bằng Phương thức GetType để xem bạn đang làm việc với những gì: $scriptPath.GetType()

Cuối cùng, một mẹo nhanh giúp tạo một lớp lót: Get-Item có gibí danh và Get-ChildItem có gcibí danh.


0

Nếu bạn muốn sử dụng $ PSScriptRoot, bạn có thể làm

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

0

Trong quyền hạn:

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

$parent_folder = Split-Path $this_script_path -Leaf
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.