如何使用 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 盘根目录的卷位于不同的卷上。