如何在 Powershell 中查找文件属于哪个分区?

如何在 Powershell 中查找文件属于哪个分区?

如何使用 Powershell 查找哪个分区文件属于哪个分区?想要使用它来查找作为访问路径安装的分区,因此它没有分配 DriveLetter。

在 Linux 中我们可以使用以下命令来执行此操作:

df /path/to/some/file.txt

我知道我们可以使用 Get-Partition 列出分区,使用 Get-Volume 或 Get-WmiObject win32_volume 列出卷,但是我无法找到一种简单的编程方法来查找特定文件所属的分区。

答案1

我们可以从 WMI 类中获取挂载点列表Win32_MountPoint。这为我们提供了卷路径和根目录之间的映射。然后我们可以找出哪个挂载点最适合给定文件。最后,我们可以使用挂载点对象中的卷 ID 来获取有关卷本身的一些信息。以下是完整脚本:

param (
    [string]$File
)
$fullPath = [string](Resolve-Path $File)
$bestMatch = ''
$bestMatchObj = $null
gwmi Win32_MountPoint | % {
    $_.Directory -match '="(.*)"' | Out-Null
    $mountDir = $matches[1].Replace('\\', '\')
    If (!$mountDir.EndsWith('\')) { $mountDir = $mountDir + '\' }
    If ($fullPath.StartsWith($mountDir, 'InvariantCultureIgnoreCase') -and $bestMatch.Length -lt $mountDir.Length) { 
        $bestMatch = $mountDir
        $bestMatchObj = $_
    }
}
$bestMatchObj.Volume -match '="(.*)"' | Out-Null
$volPath = $matches[1].Replace('\\', '\')
Get-Volume | ? { $_.Path -eq $volPath }

-followed -match-by-$matches技巧提取 WMI 关系字符串的相关部分。我们必须取消对反斜杠的转义,因此需要替换。然后,由于只有简单的驱动器号分配在其Directory值的末尾才有反斜杠,因此如果没有反斜杠,我们需要添加一个,以避免在名称相似的挂载点上出现误报。

要使用脚本,请将其保存为 PS1 文件,例如df.ps1。要启用系统上的脚本执行,请按照启用脚本部分中的说明进行操作PowerShell 标签 wiki.然后你可以像这样运行它:

.\df.ps1 -File C:\some\mounted\path\doc.txt

结果与任何其他使用返回的对象类型相同Get-Volume

DriveLetter FriendlyName FileSystemType DriveType HealthStatus OperationalStatus SizeRemaining    Size
----------- ------------ -------------- --------- ------------ ----------------- -------------    ----
            <redacted>   NTFS           Fixed     Healthy      OK                      1.93 GB 1.95 GB

请注意,它没有DriveLetter,因为这个特定的文件实际上与保存我的 C 盘根目录的卷位于不同的卷上。

相关内容