Мы можем получить список точек монтирования из класса WMI Win32_MountPoint
. Это дает нам соответствие между путями томов и корневыми каталогами. Затем мы можем выяснить, какая точка монтирования является наиболее определенной для данного файла. Наконец, мы можем использовать идентификатор тома из объекта точки монтирования, чтобы получить некоторую информацию о самом томе. Вот полный сценарий:
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 }
-match
-followed в каждом конкретном $matches
трюк извлекает соответствующие части строки отношений WMI. Мы должны убрать обратную косую черту, отсюда и замена. Затем, поскольку только простые назначения букв дисков имеют обратную косую черту в конце своего значения Directory
, нам нужно добавить одну, если она отсутствует, чтобы избежать ложных срабатываний в точках монтирования с одинаковыми именами.
Чтобы использовать скрипт, сохраните его как файл PS1, например, df.ps1
. Чтобы включить выполнение сценариев в вашей системе, следуйте инструкциям в разделе «Включение сценариев» вики-тега PowerShell . Тогда вы можете запустить его так:
.\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.