Question

J'ai un script PowerShell qui parcourt une arborescence de répertoires. Parfois, des fichiers auxiliaires y sont liés, ce qui ne doit pas être traité. Existe-t-il un moyen simple de savoir si un fichier (c'est-à-dire System.IO.FileInfo ) est un lien physique ou non?

Sinon, serait-ce plus facile avec des liens symboliques (liens symboliques)?

Était-ce utile?

La solution

Essayez ceci:

function Test-ReparsePoint([string]$path) {
  $file = Get-Item $path -Force -ea SilentlyContinue
  return [bool]($file.Attributes -band [IO.FileAttributes]::ReparsePoint)
}

Il s’agit d’une implémentation plutôt minimale, mais elle devrait suffire. Notez que cela ne fait pas la distinction entre un lien physique et un lien symbolique. En dessous, ils profitent tous deux des points de réparation NTFS , IIRC .

Autres conseils

Si vous avez Powershell 5+, la ligne suivante répertorie de manière récursive tous les liens physiques de fichiers, jonctions de répertoires et liens symboliques, ainsi que leurs cibles, à partir de d: \ Temp \ :

dir 'd:\Temp' -recurse -force | ?{

Si vous avez Powershell 5+, la ligne suivante répertorie de manière récursive tous les liens physiques de fichiers, jonctions de répertoires et liens symboliques, ainsi que leurs cibles, à partir de d: \ Temp \ :

FullName                                LinkType     Target
--------                                --------     ------
D:\Temp\MyJunctionDir                   Junction     {D:\exp\junction_target_dir}
D:\Temp\MySymLinkDir                    SymbolicLink {D:\exp\symlink_target_dir}
D:\Temp\MyHardLinkFile.txt              HardLink     {D:\temp\MyHardLinkFile2.txt, D:\exp\hlink_target.xml}
D:\Temp\MyHardLinkFile2.txt             HardLink     {D:\temp\MyHardLinkFile.txt, D:\exp\hlink_target.xml}
D:\Temp\MySymLinkFile.txt               SymbolicLink {D:\exp\symlink_target.xml}
D:\Temp\MySymLinkDir\MySymLinkFile2.txt SymbolicLink {D:\temp\normal file.txt}

Sortie:

dir 'd:\Temp' -recurse -force | ?{

Si vous avez Powershell 5+, la ligne suivante répertorie de manière récursive tous les liens physiques de fichiers, jonctions de répertoires et liens symboliques, ainsi que leurs cibles, à partir de d: \ Temp \ :

dir 'd:\Temp' -recurse -force | ?{

Si vous avez Powershell 5+, la ligne suivante répertorie de manière récursive tous les liens physiques de fichiers, jonctions de répertoires et liens symboliques, ainsi que leurs cibles, à partir de d: \ Temp \ :

FullName                                LinkType     Target
--------                                --------     ------
D:\Temp\MyJunctionDir                   Junction     {D:\exp\junction_target_dir}
D:\Temp\MySymLinkDir                    SymbolicLink {D:\exp\symlink_target_dir}
D:\Temp\MyHardLinkFile.txt              HardLink     {D:\temp\MyHardLinkFile2.txt, D:\exp\hlink_target.xml}
D:\Temp\MyHardLinkFile2.txt             HardLink     {D:\temp\MyHardLinkFile.txt, D:\exp\hlink_target.xml}
D:\Temp\MySymLinkFile.txt               SymbolicLink {D:\exp\symlink_target.xml}
D:\Temp\MySymLinkDir\MySymLinkFile2.txt SymbolicLink {D:\temp\normal file.txt}

Sortie:

<*>

Si vous vous souciez de plusieurs cibles pour les liens physiques, utilisez cette variante qui répertorie les cibles séparées par des tabulations:

<*>

Vous aurez peut-être besoin de privilèges d'administrateur pour exécuter ce script avec le code C: \ .

.LinkType} | select FullName,LinkType,Target

Sortie:

<*>

Si vous vous souciez de plusieurs cibles pour les liens physiques, utilisez cette variante qui répertorie les cibles séparées par des tabulations:

<*>

Vous aurez peut-être besoin de privilèges d'administrateur pour exécuter ce script avec le code C: \ .

.LinkType} | select FullName,LinkType,@{ Name = "Targets"; Expression={

Si vous avez Powershell 5+, la ligne suivante répertorie de manière récursive tous les liens physiques de fichiers, jonctions de répertoires et liens symboliques, ainsi que leurs cibles, à partir de d: \ Temp \ :

dir 'd:\Temp' -recurse -force | ?{

Si vous avez Powershell 5+, la ligne suivante répertorie de manière récursive tous les liens physiques de fichiers, jonctions de répertoires et liens symboliques, ainsi que leurs cibles, à partir de d: \ Temp \ :

FullName                                LinkType     Target
--------                                --------     ------
D:\Temp\MyJunctionDir                   Junction     {D:\exp\junction_target_dir}
D:\Temp\MySymLinkDir                    SymbolicLink {D:\exp\symlink_target_dir}
D:\Temp\MyHardLinkFile.txt              HardLink     {D:\temp\MyHardLinkFile2.txt, D:\exp\hlink_target.xml}
D:\Temp\MyHardLinkFile2.txt             HardLink     {D:\temp\MyHardLinkFile.txt, D:\exp\hlink_target.xml}
D:\Temp\MySymLinkFile.txt               SymbolicLink {D:\exp\symlink_target.xml}
D:\Temp\MySymLinkDir\MySymLinkFile2.txt SymbolicLink {D:\temp\normal file.txt}

Sortie:

<*>

Si vous vous souciez de plusieurs cibles pour les liens physiques, utilisez cette variante qui répertorie les cibles séparées par des tabulations:

<*>

Vous aurez peut-être besoin de privilèges d'administrateur pour exécuter ce script avec le code C: \ .

.LinkType} | select FullName,LinkType,Target

Sortie:

<*>

Si vous vous souciez de plusieurs cibles pour les liens physiques, utilisez cette variante qui répertorie les cibles séparées par des tabulations:

<*>

Vous aurez peut-être besoin de privilèges d'administrateur pour exécuter ce script avec le code C: \ .

.Target -join "`t"} }

Si vous vous souciez de plusieurs cibles pour les liens physiques, utilisez cette variante qui répertorie les cibles séparées par des tabulations:

<*>

Vous aurez peut-être besoin de privilèges d'administrateur pour exécuter ce script avec le code C: \ .

.LinkType} | select FullName,LinkType,Target

Sortie:

<*>

Si vous vous souciez de plusieurs cibles pour les liens physiques, utilisez cette variante qui répertorie les cibles séparées par des tabulations:

<*>

Vous aurez peut-être besoin de privilèges d'administrateur pour exécuter ce script avec le code C: \ .

Utilisez Where-Object pour rechercher l'attribut de fichier ReparsePoint.

Get-ChildItem | Where-Object { 

Utilisez Where-Object pour rechercher l'attribut de fichier ReparsePoint.

<*>.Attributes -match "ReparsePoint" }

Mes résultats sur Vista, utilisant le script powershell de Keith Hill pour tester les liens symboliques et les liens durs:

c:\markus\other>mklink symlink.doc \temp\2006rsltns.doc
symbolic link created for symlink.doc <<===>> \temp\2006rsltns.doc

c:\markus\other>fsutil hardlink create HARDLINK.doc  \temp\2006rsltns.doc
Hardlink created for c:\markus\other\HARDLINK.doc <<===>> c:\temp\2006rsltns.doc

c:\markus\other>dir
 Volume in drive C has no label.
 Volume Serial Number is C8BC-2EBD

 Directory of c:\markus\other

02/12/2010  05:21 PM    <DIR>          .
02/12/2010  05:21 PM    <DIR>          ..
01/10/2006  06:12 PM            25,088 HARDLINK.doc
02/12/2010  05:21 PM    <SYMLINK>      symlink.doc [\temp\2006rsltns.doc]
               2 File(s)         25,088 bytes
               2 Dir(s)   6,805,803,008 bytes free

c:\markus\other>powershell \script\IsSymLink.ps1 HARDLINK.doc
False

c:\\markus\other>powershell \script\IsSymLink.ps1 symlink.doc
True

Cela montre que les liens symboliques sont des points d'analyse et que le bit ReparsePoint FileAttribute est défini, contrairement aux liens physiques.

Le script PowerShell suivant répertorie tous les fichiers d'un ou de plusieurs répertoires avec le commutateur -recurse. Il indiquera le nom du fichier, qu’il s’agisse d’un fichier normal ou d’un fichier lié dur, ainsi que sa taille, séparés par des deux points.

Il doit être exécuté à partir de la ligne de commande PowerShell. Le répertoire à partir duquel vous l'exécutez n'a pas d'importance car il est défini dans le script.

Il utilise l'utilitaire fslink fourni avec Windows et l'exécute sur chaque fichier à l'aide des commutateurs hardlink et list et compte les lignes de sortie. Si deux ou plus, il s’agit d’un fichier à liaison fixe.

Vous pouvez bien sûr changer le répertoire dans lequel la recherche commence en modifiant le c: \ windows \ system dans la commande. De plus, le script écrit simplement les résultats dans un fichier, c: \ hardlinks.txt . Vous pouvez modifier le nom ou tout simplement supprimer tout le contenu du > caractère sur et il sera affiché à l'écran.

Get-ChildItem -path C:\Windows\system -file -recurse -force | 
    foreach-object {
        if ((fsutil hardlink list 

Le script PowerShell suivant répertorie tous les fichiers d'un ou de plusieurs répertoires avec le commutateur -recurse. Il indiquera le nom du fichier, qu’il s’agisse d’un fichier normal ou d’un fichier lié dur, ainsi que sa taille, séparés par des deux points.

Il doit être exécuté à partir de la ligne de commande PowerShell. Le répertoire à partir duquel vous l'exécutez n'a pas d'importance car il est défini dans le script.

Il utilise l'utilitaire fslink fourni avec Windows et l'exécute sur chaque fichier à l'aide des commutateurs hardlink et list et compte les lignes de sortie. Si deux ou plus, il s’agit d’un fichier à liaison fixe.

Vous pouvez bien sûr changer le répertoire dans lequel la recherche commence en modifiant le c: \ windows \ system dans la commande. De plus, le script écrit simplement les résultats dans un fichier, c: \ hardlinks.txt . Vous pouvez modifier le nom ou tout simplement supprimer tout le contenu du > caractère sur et il sera affiché à l'écran.

<*>.fullname).count -ge 2) {

Le script PowerShell suivant répertorie tous les fichiers d'un ou de plusieurs répertoires avec le commutateur -recurse. Il indiquera le nom du fichier, qu’il s’agisse d’un fichier normal ou d’un fichier lié dur, ainsi que sa taille, séparés par des deux points.

Il doit être exécuté à partir de la ligne de commande PowerShell. Le répertoire à partir duquel vous l'exécutez n'a pas d'importance car il est défini dans le script.

Il utilise l'utilitaire fslink fourni avec Windows et l'exécute sur chaque fichier à l'aide des commutateurs hardlink et list et compte les lignes de sortie. Si deux ou plus, il s’agit d’un fichier à liaison fixe.

Vous pouvez bien sûr changer le répertoire dans lequel la recherche commence en modifiant le c: \ windows \ system dans la commande. De plus, le script écrit simplement les résultats dans un fichier, c: \ hardlinks.txt . Vous pouvez modifier le nom ou tout simplement supprimer tout le contenu du > caractère sur et il sera affiché à l'écran.

<*>.PSChildname + ":Hardlinked:" +

Le script PowerShell suivant répertorie tous les fichiers d'un ou de plusieurs répertoires avec le commutateur -recurse. Il indiquera le nom du fichier, qu’il s’agisse d’un fichier normal ou d’un fichier lié dur, ainsi que sa taille, séparés par des deux points.

Il doit être exécuté à partir de la ligne de commande PowerShell. Le répertoire à partir duquel vous l'exécutez n'a pas d'importance car il est défini dans le script.

Il utilise l'utilitaire fslink fourni avec Windows et l'exécute sur chaque fichier à l'aide des commutateurs hardlink et list et compte les lignes de sortie. Si deux ou plus, il s’agit d’un fichier à liaison fixe.

Vous pouvez bien sûr changer le répertoire dans lequel la recherche commence en modifiant le c: \ windows \ system dans la commande. De plus, le script écrit simplement les résultats dans un fichier, c: \ hardlinks.txt . Vous pouvez modifier le nom ou tout simplement supprimer tout le contenu du > caractère sur et il sera affiché à l'écran.

<*>.Length } else {

Le script PowerShell suivant répertorie tous les fichiers d'un ou de plusieurs répertoires avec le commutateur -recurse. Il indiquera le nom du fichier, qu’il s’agisse d’un fichier normal ou d’un fichier lié dur, ainsi que sa taille, séparés par des deux points.

Il doit être exécuté à partir de la ligne de commande PowerShell. Le répertoire à partir duquel vous l'exécutez n'a pas d'importance car il est défini dans le script.

Il utilise l'utilitaire fslink fourni avec Windows et l'exécute sur chaque fichier à l'aide des commutateurs hardlink et list et compte les lignes de sortie. Si deux ou plus, il s’agit d’un fichier à liaison fixe.

Vous pouvez bien sûr changer le répertoire dans lequel la recherche commence en modifiant le c: \ windows \ system dans la commande. De plus, le script écrit simplement les résultats dans un fichier, c: \ hardlinks.txt . Vous pouvez modifier le nom ou tout simplement supprimer tout le contenu du > caractère sur et il sera affiché à l'écran.

<*>.PSChildname + ":RegularFile:" +

Le script PowerShell suivant répertorie tous les fichiers d'un ou de plusieurs répertoires avec le commutateur -recurse. Il indiquera le nom du fichier, qu’il s’agisse d’un fichier normal ou d’un fichier lié dur, ainsi que sa taille, séparés par des deux points.

Il doit être exécuté à partir de la ligne de commande PowerShell. Le répertoire à partir duquel vous l'exécutez n'a pas d'importance car il est défini dans le script.

Il utilise l'utilitaire fslink fourni avec Windows et l'exécute sur chaque fichier à l'aide des commutateurs hardlink et list et compte les lignes de sortie. Si deux ou plus, il s’agit d’un fichier à liaison fixe.

Vous pouvez bien sûr changer le répertoire dans lequel la recherche commence en modifiant le c: \ windows \ system dans la commande. De plus, le script écrit simplement les résultats dans un fichier, c: \ hardlinks.txt . Vous pouvez modifier le nom ou tout simplement supprimer tout le contenu du > caractère sur et il sera affiché à l'écran.

<*>.Length } } > c:\hardlinks.txt
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top