使用 Powershell,如何在给定文件全名的情况下查找挂载点驱动器

With Powershell, how to find mount point drive given a file full name

在我的环境中,我有很多安装点驱动器(以下简称 MPD),为了简化我的问题,假设我有一个全名为

的文件
d:\data\DBA\Perf\abc.sql

在这种情况下,d:\data 实际上是一个 MPD,但我们无法仅从其面值得知。 (即它可以是 D:\ 驱动器,其中包含一个名为 \data\DBA 的文件夹)

如何使用 PowerShell 从这个文件全名中找出 D:\Data 是一个 MPD?

我的环境是Windows2012 R2 + PowerShell V5.

我最初的解决方案是找到所有 MP 驱动器(我有 10 多个这样的 MPD,如 d:\Log、e:\backup、d:\MP\Backup 等),然后尝试遍历所有MPD 查找 MPD 名称是否包含在文件的全名中。如果是这样,我知道 abc.sql 在 MPD 中。

我只是想知道是否有更好的解决方案,例如 How to find the mountpoint a file resides on?。这个方案是针对Linux的,但是这个方案的重点是要测试路径中包含的每一个目录都是os.path.ismount(path).

我们可以在 windows 中找到类似的解决方案吗?或者各位大师可能在 Windows?

中有更好的解决方案

TIA,

Jeff_yao

使用 file/directory 对象的 LinkTypeTarget 属性并找到根:

function Get-ReparsePoints($path) {
    try { $file = Get-Item -literal $path } catch {}
    while ($file) {
        if ($file.LinkType) {
            [PSCustomObject]@{
                path   = $file.FullName
                target = $file.Target
                type   = $file.LinkType
            }
        }
        $file = if ($file.Parent) { $file.Parent } else { $file.Directory }
    }
}

在 PowerShell 5 中测试:

Get-ReparsePoints 'D:\lost\kill\!shared\mv\Lindsey Stirling\Radioactive.mp4'
path                       target                                          type    
----                       ------                                          ----    
D:\lost\kill\!shared\mv    {D:\lost\kill\mv}                               Junction
D:\lost                    {Volume{b2cd25bc-98e0-4cb1-bf51-f090f8dfda43}\} Junction