16

我现在开始使用 PowerShell,并且在使用 Unix shell 很长时间后,我想知道如何检查文件或目录是否存在。

在 Powershell 中,为什么Exist在下面的表达式中返回 false?

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

有没有比以下方法更好的方法来检查文件是否是目录:

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

6 回答 6

25

使用“测试路径”而不是 System.IO.FileInfo.Exists

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

您可以使用 PSIContainer 来确定文件是否为目录:

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

PS C:\Users\m> (get-item 'c:\windows\system32\notepad.exe').PSIsContainer
False
于 2009-03-12T00:08:27.980 回答
12

除了迈克尔的回答,您还可以使用以下方法进行测试:

PS H:> ([System.IO.DirectoryInfo]"C:\").Exists
True
于 2009-03-12T00:12:18.627 回答
12

在 Powershell 中,为什么 Exist 在以下表达式中返回 false?

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

因为没有名为“C:\”的文件——它是一个目录。

于 2009-03-12T20:07:32.363 回答
10
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:\
于 2009-03-12T00:12:16.803 回答
4

这两个都评估为真

$(Get-Item "C:\").GetType() -eq [System.IO.DirectoryInfo]
$(Get-Item "C:\test.txt").GetType() -eq [System.IO.FileInfo]
于 2017-05-04T02:56:19.103 回答
2

您可以使用Get-Item允许 PowerShell 在 和 之间进行FileInfo选择DirectoryInfo。如果路径未解析到某个位置,它将引发异常。

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

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

Test-Path如果您需要DirectoryInfoorFileInfo条目(如果它确实存在),我只会使用它。

于 2011-08-29T20:01:15.493 回答