在我的环境中,我有很多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
答案 0 :(得分:2)
使用文件/目录对象的LinkType
和Target
属性,然后按照自己的方式运行到根目录:
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