使用Powershell,如何在给定文件全名

时间:2017-06-30 19:39:47

标签: powershell mount-point

在我的环境中,我有很多Mount Point Drives(以下称为MPD),为了简化我的问题,比方说,我有一个全名为

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

在这种情况下,d:\ data实际上是一个MPD,但我们不知道它的面值。 (即它可以是D:\ drive,名为\ data \ DBA的文件夹)

如何通过PowerShell找到D:\ Data是这个文件全名的MPD?

我的环境是Windows 2012 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

1 个答案:

答案 0 :(得分:2)

使用文件/目录对象的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