Podemos obter a lista de pontos de montagem da classe WMI Win32_MountPoint
. Isso nos dá um mapeamento entre caminhos de volume e diretórios raiz. Podemos então descobrir qual ponto de montagem é mais específico para um determinado arquivo. Finalmente, podemos usar o ID do volume do objeto de ponto de montagem para obter algumas informações sobre o próprio volume. Aqui está o script completo:
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 }
O truque -match
-followed-by- $matches
extrai as partes relevantes das cadeias de relacionamento do WMI. Temos que descalçar as barras invertidas, daí a substituição. Então, como apenas atribuições de letra de unidade simples têm barras invertidas no final do seu valor Directory
, precisamos adicionar um se estiver ausente para evitar falsos positivos em pontos de montagem de nome semelhante.
Para usar o script, salve-o como um arquivo PS1, por exemplo, %código%. Para ativar a execução de scripts em seu sistema, siga as instruções na seção Habilitando Scripts do wiki de tags do PowerShell . Então você pode executá-lo assim:
.\df.ps1 -File C:\some\mounted\path\doc.txt
Os resultados são do mesmo tipo que os objetos retornados de qualquer outro uso de df.ps1
:
DriveLetter FriendlyName FileSystemType DriveType HealthStatus OperationalStatus SizeRemaining Size
----------- ------------ -------------- --------- ------------ ----------------- ------------- ----
<redacted> NTFS Fixed Healthy OK 1.93 GB 1.95 GB
Observe como ele não tem Get-Volume
, já que esse arquivo em particular estava em um volume diferente daquele que contém a raiz da minha unidade C.