Question

Comment puis-je tester dans le code PowerShell si un dossier est un point de jonction ?

Était-ce utile?

La solution

Jetez un oeil à ce blog:http://blogs.msdn.com/powershell/archive/2010/02/10/viewing-junctions-with-dir.aspx

la façon de procéder est de copier le fichier de formatage du système de fichiers intégré, de le modifier pour que les jonctions soient indiquées, puis de le charger avec Mettre à jour les données de format:

Du blog:

Les règles de formatage du système de fichiers sont en $pshome\FileSystem.Format.ps1xml.I. copié ceci, puis dans l'élément [ViewDefinitions –> View –> TableControl –> TableRowEntries –> TableRowEntry –> TableColumnItems –> TableColumnItem] J'ai changé le contenu de Nom de la propriété avec la valeur de 'Mode' à ce qui suit:

<ScriptBlock> 
   "$($_.Mode)$(if($_.Attributes -band [IO.FileAttributes]::ReparsePoint)
{'J'})" </ScriptBlock> 

Cela fait un AND bitwise sur le DirectoryInfo object Attributs propriété ($_.Attributes) contre la .Net System.IO.FileAttributes.ReparsePointvaleur enum.Si le résultat n'est pas nul, il affiche un «J» à côté de l’autre les attributs du mode fichier.Ensuite, chargez le nouveau fichier de formatage comme ceci:

 PS> Update-FormatData -PrependPath myFilesystem.format.ps1xml

Le Pré-Path paramètre assure que le nouveau fichier de formatage est chargé avant les fichiers de formatage intégrés.

Le lien de répertoire a un ‘J’ dans le mode colonne, semble fonctionner!

C'est dans la colonne Mode J pour La jonction.

Autres conseils

Si (Get-Item Dossier test ). Attributes.ToString (). Contains ( "reparsepoint") { code }

Depuis au moins PowerShell v5.0, il y a un meilleur soutien pour les liens (ou MS les appelle: Reparse Points)

amélioration cmdlets de l'article - LinkType propriété

article lié est dans la catégorie WMF 5.0, ce qui pourrait signifier que la méthode était disponible depuis PS v5.0.
Ces caractéristiques ont été incluses dans la norme Get-Item, Get-ChildItem, donc il n'y a pas de mesures supplémentaires nécessaires. Il peut être utilisé sur tout PS actuel.

LinkType est une propriété de chaîne sur un objet, retourné par Get-Item et Get-ChildItem,
il peut avoir l'une des quatre valeurs suivantes: « », « Junction », « SymbolicLink », « HardLink ».

Pour répondre à la question de l'OP, vous pouvez vérifier si un dossier est un point de jonction avec:

if ((Get-Item -Path $Target -Force).LinkType -eq "Junction") { }

Pour vérifier si un fichier / dossier est un, de quelque nature que "reparsepoint" (Junction, SymbolicLink ou HardLink):

if ((Get-Item -Path $Target -Force).LinkType) { }

valeur LinkType le fichier ordinaire / dossier est une chaîne vide, qui, lorsqu'il est utilisé comme si condition PS résout False


Get-ChildItem peut être utilisé pour lister tous les dossiers de jonction:

(Get-ChildItem -Path $Target -Force) | Where-Object { $_.LinkType -eq "Junction" }

Notez que la valeur « SymbolicLink » est le même pour les deux fichier ou un dossier, donc à la liste uniquement les liens symboliques vers des dossiers:

(Get-ChildItem -Path $Target -Directory -Force) | Where-Object { $_.LinkType -eq "SymbolicLink" }


Applet de commande Get-ChildItem (alias: dir, ls, GCI) montre maintenant attribut reparsepoint, comme l dans la colonne mode, sans aucune extension. Mais il ne sera pas montrer « HardLink » et montre l pour les Junction et SymbolicLink:

> Get-ChildItem -Path $Target -Force


    Directory: C:\Users


Mode                LastWriteTime         Length Name                          
----                -------------         ------ ----                          
d--hsl       2018-04-12     01:45                All Users                     
d-rh--       2018-05-09     06:12                Default                       
d--hsl       2018-04-12     01:45                Default User                  
d-----       2018-06-24     03:05                Papo                          
d-r---       2018-07-27     07:12                Public
  • LinkType ne fonctionne pas sur les dossiers avec des autorisations spéciales à l'intérieur \ Users \ Users \ et, même si Get-ChildItem comme on le voit ci-dessus fonctionne et montre l sur eux.
  • Remove-Item a des problèmes. Il ne peut pas supprimer Junction, et si elle est forcée, supprimera le contenu original avec elle. Ceci est dit fixe dans la version future PS v6

L'utilisation de ces améliorés ou Cmdlets standard d'aujourd'hui, a des avantages par rapport aux méthodes précédentes, décrites dans les réponses plus anciennes ici.

  • Il ne fait aucune distinction entre la jonction et lien symbolique
    Si OP voulait tester si le dossier est une jonction, la vérification par la propriété d'attribut entraînerait faux positif pour le dossier Lien symbolique.

  • détecte dur Lien.

  • LinkType est [chaîne], par opposition aux attributs propriété, qui est [FileAttributes] type et doit .ToString () ou une utilisation de -band

Pour votre information, si vous arrive d'être en cours d'exécution PowerShell Community Extensions , cette information est disponible en sortie (et une propriété de note) sur la sortie de Get-ChildItem:

21> gci .\Roaming\Microsoft\eHome


    Directory: Microsoft.PowerShell.Core\FileSystem::C:\Users...


Mode           LastWriteTime       Length Name
----           -------------       ------ ----
d----     2/15/2010 12:18 AM        <DIR> DvdCoverCache
d----      8/9/2009  1:10 AM    <SYMLINK> DvdInfoCache [\...
d----      8/8/2009 11:51 PM        <DIR> DvdInfoCache.orig
d----    10/22/2009  7:12 PM        <DIR> mcl_images

Cependant, pour l'accès programmatique j'accéder à l'information via la propriété Attributs que l'autre affiche indique.

Si vous avez les extensions communautaires PowerShell que je recommande si vous travaillez avec des jonctions, vous pouvez effectuer les opérations suivantes pour déterminer si un dossier est une jonction ou non:

Import-Module pscx
if ((Get-Item *test_folder*).ReparsePoint){
    Write-Host "YES"
}

Essayez ceci:

$TargetAttributes = (Get-Item -Path $Target -Force).Attributes.ToString()
if ($TargetAttributes -match "ReparsePoint") {
    if ($TargetAttributes -match "Archive") {
        Write-Output ("Link to a file.")
    } else {
        Write-Output ("Link to a folder.")
    }
} else {
    Write-Output ("Normal File or Folder.")
}    
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top