Как использовать объект 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]