Tôi có thể lấy tất cả các mục con một cách đệ quy bằng lệnh này:
Get-ChildItem -recurse
Nhưng có cách nào để hạn chế độ sâu không? Nếu tôi chỉ muốn đệ quy một hoặc hai cấp độ xuống chẳng hạn?
Câu trả lời:
Sử dụng điều này để giới hạn độ sâu đến 2:
Get-ChildItem \*\*\*,\*\*,\*
Cách thức hoạt động là nó trả về các con ở mỗi độ sâu 2,1 và 0.
Giải trình:
Lệnh này
Get-ChildItem \*\*\*
trả về tất cả các mục có độ sâu bằng hai thư mục con. Thêm \ * sẽ thêm một thư mục con bổ sung để tìm kiếm.
Theo câu hỏi OP, để giới hạn tìm kiếm đệ quy bằng get-childitem, bạn bắt buộc phải chỉ định tất cả các độ sâu có thể được tìm kiếm.
Get-ChildItem .\*\*\*,.\*\*,.\*Tại một số điểm, bởi PowerShell 5.1, Get-ChildItem bây giờ có một -Depththam số.
Kể từ powershell 5.0 , bây giờ bạn có thể sử dụng -Depththam số trong Get-ChildItem!
Bạn kết hợp nó với -Recurseđể hạn chế đệ quy.
Get-ChildItem -Recurse -Depth 2
-Recursetắc là tùy chọn / ngụ ý khi -Depthđược chỉ định.
-Excludekhi được bao gồm với giá trị -Depthphủ định -Depth.
gci c:\*.exe -Depth 1trả về tệp nhiều thư mục con sâu.
gci c:\ -filter *.exe -depth 1có thể sẽ giúp bạn có được thứ bạn muốn @GuitarPicker Tuy nhiên, tôi không có máy windows để kiểm tra ngay bây giờ
Hãy thử chức năng này:
Function Get-ChildItemToDepth {
Param(
[String]$Path = $PWD,
[String]$Filter = "*",
[Byte]$ToDepth = 255,
[Byte]$CurrentDepth = 0,
[Switch]$DebugMode
)
$CurrentDepth++
If ($DebugMode) {
$DebugPreference = "Continue"
}
Get-ChildItem $Path | %{
$_ | ?{ $_.Name -Like $Filter }
If ($_.PsIsContainer) {
If ($CurrentDepth -le $ToDepth) {
# Callback to this function
Get-ChildItemToDepth -Path $_.FullName -Filter $Filter `
-ToDepth $ToDepth -CurrentDepth $CurrentDepth
}
Else {
Write-Debug $("Skipping GCI for Folder: $($_.FullName) " + `
"(Why: Current depth $CurrentDepth vs limit depth $ToDepth)")
}
}
}
}
Get-ChildItemToDepth -ToDepth 2(làm việc trên thư mục hiện tại)
Tôi đã cố gắng giới hạn độ sâu đệ quy Get-ChildItem bằng cách sử dụng Resolve-Path
$PATH = "."
$folder = get-item $PATH
$FolderFullName = $Folder.FullName
$PATHs = Resolve-Path $FolderFullName\*\*\*\
$Folders = $PATHs | get-item | where {$_.PsIsContainer}
Nhưng điều này hoạt động tốt:
gci "$PATH\*\*\*\*"
Đây là một hàm xuất ra một dòng cho mỗi mục, có thụt lề theo mức độ sâu. Nó có lẽ dễ đọc hơn nhiều.
function GetDirs($path = $pwd, [Byte]$ToDepth = 255, [Byte]$CurrentDepth = 0)
{
$CurrentDepth++
If ($CurrentDepth -le $ToDepth) {
foreach ($item in Get-ChildItem $path)
{
if (Test-Path $item.FullName -PathType Container)
{
"." * $CurrentDepth + $item.FullName
GetDirs $item.FullName -ToDepth $ToDepth -CurrentDepth $CurrentDepth
}
}
}
}
Nó dựa trên một bài đăng trên blog, Practical PowerShell: Tỉa cây tệp và mở rộng Cmdlets .
@scanlegentil Tôi thích điều này.
Một chút cải tiến sẽ là:
$Depth = 2
$Path = "."
$Levels = "\*" * $Depth
$Folder = Get-Item $Path
$FolderFullName = $Folder.FullName
Resolve-Path $FolderFullName$Levels | Get-Item | ? {$_.PsIsContainer} | Write-Host
Như đã đề cập, điều này sẽ chỉ quét độ sâu được chỉ định, vì vậy sửa đổi này là một cải tiến:
$StartLevel = 1 # 0 = include base folder, 1 = sub-folders only, 2 = start at 2nd level
$Depth = 2 # How many levels deep to scan
$Path = "." # starting path
For ($i=$StartLevel; $i -le $Depth; $i++) {
$Levels = "\*" * $i
(Resolve-Path $Path$Levels).ProviderPath | Get-Item | Where PsIsContainer |
Select FullName
}