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

Tim*_*imB 5 windows powershell

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

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

df /path/to/some/file.txt
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*n N 5

我们可以从 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 }
Run Code Online (Sandbox Code Playgroud)

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

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

.\df.ps1 -File C:\some\mounted\path\doc.txt
Run Code Online (Sandbox Code Playgroud)

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

DriveLetter FriendlyName FileSystemType DriveType HealthStatus OperationalStatus SizeRemaining    Size
----------- ------------ -------------- --------- ------------ ----------------- -------------    ----
            <redacted>   NTFS           Fixed     Healthy      OK                      1.93 GB 1.95 GB
Run Code Online (Sandbox Code Playgroud)

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