5

Как узнать, к какому файлу раздела принадлежит Powershell? Хотите использовать это, чтобы найти раздел, который смонтирован как путь доступа, поэтому ему не назначен DriveLetter.

В Linux мы можем использовать следующую команду для этого:

df /path/to/some/file.txt

Мне известно, что мы можем составить список разделов с помощью Get-Partition, список томов с помощью Get-Volume или Get-WmiObject win32_volume, однако я не могу найти простой программный способ найти раздел, к которому принадлежит тот или иной файл.

1 ответ1

5

Мы можем получить список точек монтирования из класса 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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .