Как использовать объект FileInfo из Powershell - PullRequest
10 голосов
/ 12 марта 2009

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

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

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

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

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

Ответы [ 6 ]

22 голосов
/ 12 марта 2009

Используйте '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
10 голосов
/ 12 марта 2009

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

PS H:> ([System.IO.DirectoryInfo]"C:\").Exists
True
9 голосов
/ 12 марта 2009

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

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

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

8 голосов
/ 12 марта 2009
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:\
2 голосов
/ 04 мая 2017

Оба из них оценивают как истинные

$(Get-Item "C:\").GetType() -eq [System.IO.DirectoryInfo]
$(Get-Item "C:\test.txt").GetType() -eq [System.IO.FileInfo]
2 голосов
/ 30 августа 2011

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

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

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

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

...