2009-03-11 25 views
11

Tôi hiện đang bắt đầu sử dụng PowerShell và sau rất nhiều thời gian bằng cách sử dụng vỏ Unix và muốn biết cách kiểm tra sự tồn tại của tệp hoặc thư mục.Cách sử dụng đối tượng FileInfo từ Powershell

Trong Powershell tại sao Exist trả về false trong biểu thức sau?

PS H:\> ([System.IO.FileInfo]"C:\").Exists 
False 

Và đó là một cách tốt hơn để kiểm tra xem một tập tin là một thư mục hơn:

PS H:\> ([System.IO.FileInfo]"C:\").Mode.StartsWith("d") 
True 

Trả lời

20

Sử dụng 'test-path' thay vì System.IO.FileInfo.Exists

PS C:\Users\m> test-path 'C:\' 
True 

Bạn có thể sử dụng PSIsContainer để xác định xem tệp có phải là một thư mục hay không:

PS C:\Users\m> (get-item 'c:\').PSIsContainer 
True 

PS C:\Users\m> (get-item 'c:\windows\system32\notepad.exe').PSIsContainer 
False 
7
Help Test-Path 

Test-Path Determines whether all elements of a path exist 

Test-Path -PathType Leaf C:\test.txt 
Test-Path -PathType Container C:\ 
Test-Path C:\ 
10

Ngoài Michael's answer bạn cũng có thể kiểm tra sử dụng:

PS H:> ([System.IO.DirectoryInfo]"C:\").Exists 
True 
7

Trong Powershell tại sao tồn tại trả về false trong biểu thức sau đây?

 
    PS H:> ([System.IO.FileInfo]"C:\").Exists 

Vì không có tập tin gọi là "C: \" - đó là một thư mục.

+0

Tôi đã quen với Unix nơi một thư mục là một tập tin quá. – BeWarned

1

Bạn có thể sử dụng Get-Item để cho phép PowerShell chọn giữa FileInfoDirectoryInfo. Nó sẽ ném một ngoại lệ nếu đường dẫn không giải quyết đến một vị trí.

PS> $(Get-Item "C:\").GetType() 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  DirectoryInfo       System.IO.FileSystemInfo 

tôi sẽ chỉ sử dụng này trên Test-Path nếu bạn sẽ cần sự xâm nhập DirectoryInfo hoặc FileInfo nếu nó tồn tại.

0

Cả hai đánh giá là true

$(Get-Item "C:\").GetType() -eq [System.IO.DirectoryInfo] 
$(Get-Item "C:\test.txt").GetType() -eq [System.IO.FileInfo] 
Các vấn đề liên quan