Как использовать объект FileInfo из Powershell

Теперь я начинаю использовать PowerShell и через много времени использую оболочки Unix и хочу знать, как проверить наличие файла или каталога.

В Powershell почему Exist возвращает false в следующем выражении?

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

И есть ли лучший способ проверить, является ли файл каталогом, чем:

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

Ответ 1

Используйте 'test-path' вместо System.IO.FileInfo.Exists

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

Вы можете использовать PSIsContainer, чтобы определить, является ли файл каталогом:

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

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

Ответ 2

В дополнение к Michael answer вы также можете протестировать, используя:

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

Ответ 3

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:\

Ответ 4

В Powershell зачем Exist возвращает false в следующем выражении?

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

Поскольку нет файла с именем "C: \" - это каталог.

Ответ 5

Вы можете использовать Get-Item, чтобы PowerShell мог выбирать между FileInfo и DirectoryInfo. Он выдает исключение, если путь не разрешен для местоположения.

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

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

Я использовал бы это только через Test-Path, если вам понадобится запись DirectoryInfo или FileInfo, если она существует.

Ответ 6

Оба они оценивают true

$(Get-Item "C:\").GetType() -eq [System.IO.DirectoryInfo]
$(Get-Item "C:\test.txt").GetType() -eq [System.IO.FileInfo]