Como encontrar qual arquivo de partição pertence ao Powershell?

5

Como descobrir qual arquivo de partição pertence ao Powershell? Deseja usar isso para encontrar uma partição que esteja montada como caminho de acesso, para que não tenha uma DriveLetter atribuída.

No Linux, podemos usar o seguinte comando para fazer isso:

df /path/to/some/file.txt

Estou ciente de que podemos listar partições usando Get-Partition, listar volumes usando Get-Volume ou Get-WmiObject win32_volume, mas não consigo encontrar uma maneira fácil e programática de encontrar uma partição à qual um determinado arquivo pertence .

    
por TimB 20.10.2017 / 22:27

1 resposta

5

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.

    
por 21.10.2017 / 05:08