2017-06-30 6 views
1

Dans mon environnement, j'ai beaucoup de lecteurs de point de montage (MPD ci-après), pour simplifier ma question, disons, j'ai un fichier dont le nom complet estAvec Powershell, comment trouver le lecteur de point de montage donné un nom de fichier complet

d:\data\DBA\Perf\abc.sql 

Dans ce cas, d: \ data est en fait un MPD mais nous ne connaissons pas seulement sa valeur nominale. (c'est-à-dire qu'il peut être D: \ drive avec un dossier appelé \ data \ DBA)

Comment puis-je savoir D: \ Data est un MPD avec ce nom de fichier complet avec PowerShell?

Mon environnement est Windows 2012 R2 + PowerShell V5. Ma première solution est de trouver tous les lecteurs MP (j'ai 10+ tels MPD, comme d: \ Log, e: \ sauvegarde, d: \ MP \ Backup etc), puis essayer de faire défiler tous les MPD à trouvez si un nom MPD est contenu dans le nom complet du fichier. Si oui, je sais abc.sql est dans un MPD.

Je me demande simplement s'il existe une meilleure solution, quelque chose comme ça How to find the mountpoint a file resides on?. Cette solution est pour Linux, mais le point clé de cette solution est de tester chaque répertoire contenu dans le chemin avec os.path.ismount (chemin). Pouvons-nous avoir une solution similaire dans Windows?

Ou vous les gourous peuvent avoir une meilleure solution dans Windows?

TIA,

Jeff_yao

Répondre

2

Utilisez LinkType et Target propriétés d'un fichier/répertoire objet et travailler votre chemin à la racine:

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 } 
    } 
} 

Testé 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 
+0

c'est vraiment génial et ça aide beaucoup. Vous êtes un vrai gourou. – jyao

+0

@ wOxxOm, si cela ne vous dérange pas, il semble que les propriétés LinkType/Target ne sont disponibles que sur PS V5, n'est-ce pas? parce que je teste votre script dans PowerShell V4, il ne semble pas fonctionner alors que tout fonctionne bien dans PS V5. :-) – jyao

+0

@jyao, tu as raison je suppose, la fonctionnalité a été ajoutée dans PS5 apparemment. – wOxxOm