Pregunta

Tengo un script de PowerShell que recorre un árbol de directorios, y a veces tengo archivos auxiliares enlazados allí que no deben procesarse. ¿Hay una manera fácil de averiguar si un archivo (es decir, System.IO.FileInfo ) es un enlace duro o no?

Si no, ¿sería más fácil con enlaces simbólicos (enlaces simbólicos)?

¿Fue útil?

Solución

Prueba esto:

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

Es una implementación bastante mínima, pero debería hacer el truco. Tenga en cuenta que esto no distingue entre un enlace físico y un enlace simbólico. Debajo, ambos se aprovechan de los puntos de análisis NTFS , IIRC .

Otros consejos

Si tiene Powershell 5+, el siguiente one-liner enumera recursivamente todos los enlaces duros de archivos, uniones de directorio y enlaces simbólicos y sus objetivos a partir de d: \ Temp \ :

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

Si tiene Powershell 5+, el siguiente one-liner enumera recursivamente todos los enlaces duros de archivos, uniones de directorio y enlaces simbólicos y sus objetivos a 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}

Salida:

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

Si tiene Powershell 5+, el siguiente one-liner enumera recursivamente todos los enlaces duros de archivos, uniones de directorio y enlaces simbólicos y sus objetivos a partir de d: \ Temp \ :

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

Si tiene Powershell 5+, el siguiente one-liner enumera recursivamente todos los enlaces duros de archivos, uniones de directorio y enlaces simbólicos y sus objetivos a 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}

Salida:

<*>

Si le interesan los objetivos múltiples para enlaces duros, use esta variación que enumera los objetivos separados por tabulaciones:

<*>

Es posible que necesite privilegios de administrador para ejecutar este script en say C: \ .

.LinkType} | select FullName,LinkType,Target

Salida:

<*>

Si le interesan los objetivos múltiples para enlaces duros, use esta variación que enumera los objetivos separados por tabulaciones:

<*>

Es posible que necesite privilegios de administrador para ejecutar este script en say C: \ .

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

Si tiene Powershell 5+, el siguiente one-liner enumera recursivamente todos los enlaces duros de archivos, uniones de directorio y enlaces simbólicos y sus objetivos a partir de d: \ Temp \ :

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

Si tiene Powershell 5+, el siguiente one-liner enumera recursivamente todos los enlaces duros de archivos, uniones de directorio y enlaces simbólicos y sus objetivos a 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}

Salida:

<*>

Si le interesan los objetivos múltiples para enlaces duros, use esta variación que enumera los objetivos separados por tabulaciones:

<*>

Es posible que necesite privilegios de administrador para ejecutar este script en say C: \ .

.LinkType} | select FullName,LinkType,Target

Salida:

<*>

Si le interesan los objetivos múltiples para enlaces duros, use esta variación que enumera los objetivos separados por tabulaciones:

<*>

Es posible que necesite privilegios de administrador para ejecutar este script en say C: \ .

.Target -join "`t"} }

Si le interesan los objetivos múltiples para enlaces duros, use esta variación que enumera los objetivos separados por tabulaciones:

<*>

Es posible que necesite privilegios de administrador para ejecutar este script en say C: \ .

.LinkType} | select FullName,LinkType,Target

Salida:

<*>

Si le interesan los objetivos múltiples para enlaces duros, use esta variación que enumera los objetivos separados por tabulaciones:

<*>

Es posible que necesite privilegios de administrador para ejecutar este script en say C: \ .

Utilice Where-Object para buscar el atributo de archivo ReparsePoint.

Get-ChildItem | Where-Object { 

Utilice Where-Object para buscar el atributo de archivo ReparsePoint.

<*>.Attributes -match "ReparsePoint" }

Mis resultados en Vista, utilizando el script powershell de Keith Hill para probar enlaces simbólicos y enlaces físicos:

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

Muestra que los enlaces simbólicos son puntos de análisis y tienen establecido el bit ReptribPoint FileAttribute, mientras que los enlaces duros no lo hacen.

El siguiente script de PowerShell enumerará todos los archivos en un directorio o directorios con el modificador -recurse. Enumerará el nombre del archivo, ya sea un archivo normal o un archivo enlazado, y el tamaño, separados por dos puntos.

Debe ejecutarse desde la línea de comandos de PowerShell. No importa desde qué directorio lo ejecute, ya que está configurado en el script.

Utiliza la utilidad fslink que se incluye con Windows y la ejecuta en cada archivo mediante el enlace rígido y los conmutadores de lista y cuenta las líneas de salida. Si dos o más, es un archivo enlazado.

Por supuesto, puede cambiar el directorio desde el que comienza la búsqueda cambiando c: \ windows \ system en el comando. Además, el script simplemente escribe los resultados en un archivo, c: \ hardlinks.txt . Puede cambiar el nombre o simplemente eliminar todo de > carácter activado y saldrá a la pantalla.

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

El siguiente script de PowerShell enumerará todos los archivos en un directorio o directorios con el modificador -recurse. Enumerará el nombre del archivo, ya sea un archivo normal o un archivo enlazado, y el tamaño, separados por dos puntos.

Debe ejecutarse desde la línea de comandos de PowerShell. No importa desde qué directorio lo ejecute, ya que está configurado en el script.

Utiliza la utilidad fslink que se incluye con Windows y la ejecuta en cada archivo mediante el enlace rígido y los conmutadores de lista y cuenta las líneas de salida. Si dos o más, es un archivo enlazado.

Por supuesto, puede cambiar el directorio desde el que comienza la búsqueda cambiando c: \ windows \ system en el comando. Además, el script simplemente escribe los resultados en un archivo, c: \ hardlinks.txt . Puede cambiar el nombre o simplemente eliminar todo de > carácter activado y saldrá a la pantalla.

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

El siguiente script de PowerShell enumerará todos los archivos en un directorio o directorios con el modificador -recurse. Enumerará el nombre del archivo, ya sea un archivo normal o un archivo enlazado, y el tamaño, separados por dos puntos.

Debe ejecutarse desde la línea de comandos de PowerShell. No importa desde qué directorio lo ejecute, ya que está configurado en el script.

Utiliza la utilidad fslink que se incluye con Windows y la ejecuta en cada archivo mediante el enlace rígido y los conmutadores de lista y cuenta las líneas de salida. Si dos o más, es un archivo enlazado.

Por supuesto, puede cambiar el directorio desde el que comienza la búsqueda cambiando c: \ windows \ system en el comando. Además, el script simplemente escribe los resultados en un archivo, c: \ hardlinks.txt . Puede cambiar el nombre o simplemente eliminar todo de > carácter activado y saldrá a la pantalla.

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

El siguiente script de PowerShell enumerará todos los archivos en un directorio o directorios con el modificador -recurse. Enumerará el nombre del archivo, ya sea un archivo normal o un archivo enlazado, y el tamaño, separados por dos puntos.

Debe ejecutarse desde la línea de comandos de PowerShell. No importa desde qué directorio lo ejecute, ya que está configurado en el script.

Utiliza la utilidad fslink que se incluye con Windows y la ejecuta en cada archivo mediante el enlace rígido y los conmutadores de lista y cuenta las líneas de salida. Si dos o más, es un archivo enlazado.

Por supuesto, puede cambiar el directorio desde el que comienza la búsqueda cambiando c: \ windows \ system en el comando. Además, el script simplemente escribe los resultados en un archivo, c: \ hardlinks.txt . Puede cambiar el nombre o simplemente eliminar todo de > carácter activado y saldrá a la pantalla.

<*>.Length } else {

El siguiente script de PowerShell enumerará todos los archivos en un directorio o directorios con el modificador -recurse. Enumerará el nombre del archivo, ya sea un archivo normal o un archivo enlazado, y el tamaño, separados por dos puntos.

Debe ejecutarse desde la línea de comandos de PowerShell. No importa desde qué directorio lo ejecute, ya que está configurado en el script.

Utiliza la utilidad fslink que se incluye con Windows y la ejecuta en cada archivo mediante el enlace rígido y los conmutadores de lista y cuenta las líneas de salida. Si dos o más, es un archivo enlazado.

Por supuesto, puede cambiar el directorio desde el que comienza la búsqueda cambiando c: \ windows \ system en el comando. Además, el script simplemente escribe los resultados en un archivo, c: \ hardlinks.txt . Puede cambiar el nombre o simplemente eliminar todo de > carácter activado y saldrá a la pantalla.

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

El siguiente script de PowerShell enumerará todos los archivos en un directorio o directorios con el modificador -recurse. Enumerará el nombre del archivo, ya sea un archivo normal o un archivo enlazado, y el tamaño, separados por dos puntos.

Debe ejecutarse desde la línea de comandos de PowerShell. No importa desde qué directorio lo ejecute, ya que está configurado en el script.

Utiliza la utilidad fslink que se incluye con Windows y la ejecuta en cada archivo mediante el enlace rígido y los conmutadores de lista y cuenta las líneas de salida. Si dos o más, es un archivo enlazado.

Por supuesto, puede cambiar el directorio desde el que comienza la búsqueda cambiando c: \ windows \ system en el comando. Además, el script simplemente escribe los resultados en un archivo, c: \ hardlinks.txt . Puede cambiar el nombre o simplemente eliminar todo de > carácter activado y saldrá a la pantalla.

<*>.Length } } > c:\hardlinks.txt
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top