Averigüe si un archivo es un enlace simbólico en PowerShell
-
03-07-2019 - |
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)?
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