Узнайте, является ли файл символической ссылкой в ​​PowerShell

StackOverflow https://stackoverflow.com/questions/817794

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть сценарий PowerShell, который проходит по дереву каталогов, и иногда у меня есть жесткие ссылки на вспомогательные файлы, которые не следует обрабатывать.Есть ли простой способ узнать, является ли файл (т. е. System.IO.FileInfo) жесткая ссылка или нет?

Если нет, то было бы проще с символическими ссылками (symlinks)?

Это было полезно?

Решение

Попробуйте это:

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

Это довольно минимальная реализация, но она должна сработать. Обратите внимание, что это не различает жесткую ссылку и символическую ссылку. Внизу они оба просто используют точки повторной обработки NTFS , IIRC .

Другие советы

Если у вас Powershell 5+, следующая однострочная строка рекурсивно перечисляет все жесткие ссылки файлов, соединения каталогов и символические ссылки, а также их цели, начиная с d:\Temp\:

dir 'd:\Temp' -recurse -force | ?{$_.LinkType} | select FullName,LinkType,Target

Выход:

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}

Если вас интересуют несколько целей для жестких ссылок, используйте этот вариант, в котором цели перечислены через табуляцию:

dir 'd:\Temp' -recurse -force | ?{$_.LinkType} | select FullName,LinkType,@{ Name = "Targets"; Expression={$_.Target -join "`t"} }

Вам могут потребоваться права администратора для запуска этого сценария, скажем, C:\.

Используйте Where-Object для поиска атрибута файла ReparsePoint.

Get-ChildItem | Where-Object { 

Используйте Where-Object для поиска атрибута файла ReparsePoint.

<*>.Attributes -match "ReparsePoint" }

Мои результаты в Vista с использованием скрипта powershell Кейта Хилла для тестирования символических и жестких ссылок:

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

Он показывает, что символические ссылки являются точками повторной обработки и имеют установленный бит ReparsePoint FileAttribute, а жесткие ссылки - нет.

Следующий скрипт PowerShell перечислит все файлы в каталоге или каталогах с ключом -recurse. В нем будет указано имя файла, будь то обычный файл или файл с жесткими ссылками, а также размер, разделенный двоеточиями.

Он должен быть запущен из командной строки PowerShell. Неважно, из какого каталога вы его запускаете, так как он установлен в скрипте.

Он использует утилиту fslink, поставляемую с Windows, и запускает ее для каждого файла, используя переключатели hardlink и list, и подсчитывает строки вывода. Если два или больше, это файл с жесткой ссылкой.

Конечно, вы можете изменить каталог, с которого начинается поиск, изменив c: \ windows \ system в команде. Кроме того, сценарий просто записывает результаты в файл c: \ hardlinks.txt . Вы можете изменить имя или просто удалить все из > символ включен, и он будет выводиться на экран.

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

Следующий скрипт PowerShell перечислит все файлы в каталоге или каталогах с ключом -recurse. В нем будет указано имя файла, будь то обычный файл или файл с жесткими ссылками, а также размер, разделенный двоеточиями.

Он должен быть запущен из командной строки PowerShell. Неважно, из какого каталога вы его запускаете, так как он установлен в скрипте.

Он использует утилиту fslink, поставляемую с Windows, и запускает ее для каждого файла, используя переключатели hardlink и list, и подсчитывает строки вывода. Если два или больше, это файл с жесткой ссылкой.

Конечно, вы можете изменить каталог, с которого начинается поиск, изменив c: \ windows \ system в команде. Кроме того, сценарий просто записывает результаты в файл c: \ hardlinks.txt . Вы можете изменить имя или просто удалить все из > символ включен, и он будет выводиться на экран.

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

Следующий скрипт PowerShell перечислит все файлы в каталоге или каталогах с ключом -recurse. В нем будет указано имя файла, будь то обычный файл или файл с жесткими ссылками, а также размер, разделенный двоеточиями.

Он должен быть запущен из командной строки PowerShell. Неважно, из какого каталога вы его запускаете, так как он установлен в скрипте.

Он использует утилиту fslink, поставляемую с Windows, и запускает ее для каждого файла, используя переключатели hardlink и list, и подсчитывает строки вывода. Если два или больше, это файл с жесткой ссылкой.

Конечно, вы можете изменить каталог, с которого начинается поиск, изменив c: \ windows \ system в команде. Кроме того, сценарий просто записывает результаты в файл c: \ hardlinks.txt . Вы можете изменить имя или просто удалить все из > символ включен, и он будет выводиться на экран.

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

Следующий скрипт PowerShell перечислит все файлы в каталоге или каталогах с ключом -recurse. В нем будет указано имя файла, будь то обычный файл или файл с жесткими ссылками, а также размер, разделенный двоеточиями.

Он должен быть запущен из командной строки PowerShell. Неважно, из какого каталога вы его запускаете, так как он установлен в скрипте.

Он использует утилиту fslink, поставляемую с Windows, и запускает ее для каждого файла, используя переключатели hardlink и list, и подсчитывает строки вывода. Если два или больше, это файл с жесткой ссылкой.

Конечно, вы можете изменить каталог, с которого начинается поиск, изменив c: \ windows \ system в команде. Кроме того, сценарий просто записывает результаты в файл c: \ hardlinks.txt . Вы можете изменить имя или просто удалить все из > символ включен, и он будет выводиться на экран.

<*>.Length } else {

Следующий скрипт PowerShell перечислит все файлы в каталоге или каталогах с ключом -recurse. В нем будет указано имя файла, будь то обычный файл или файл с жесткими ссылками, а также размер, разделенный двоеточиями.

Он должен быть запущен из командной строки PowerShell. Неважно, из какого каталога вы его запускаете, так как он установлен в скрипте.

Он использует утилиту fslink, поставляемую с Windows, и запускает ее для каждого файла, используя переключатели hardlink и list, и подсчитывает строки вывода. Если два или больше, это файл с жесткой ссылкой.

Конечно, вы можете изменить каталог, с которого начинается поиск, изменив c: \ windows \ system в команде. Кроме того, сценарий просто записывает результаты в файл c: \ hardlinks.txt . Вы можете изменить имя или просто удалить все из > символ включен, и он будет выводиться на экран.

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

Следующий скрипт PowerShell перечислит все файлы в каталоге или каталогах с ключом -recurse. В нем будет указано имя файла, будь то обычный файл или файл с жесткими ссылками, а также размер, разделенный двоеточиями.

Он должен быть запущен из командной строки PowerShell. Неважно, из какого каталога вы его запускаете, так как он установлен в скрипте.

Он использует утилиту fslink, поставляемую с Windows, и запускает ее для каждого файла, используя переключатели hardlink и list, и подсчитывает строки вывода. Если два или больше, это файл с жесткой ссылкой.

Конечно, вы можете изменить каталог, с которого начинается поиск, изменив c: \ windows \ system в команде. Кроме того, сценарий просто записывает результаты в файл c: \ hardlinks.txt . Вы можете изменить имя или просто удалить все из > символ включен, и он будет выводиться на экран.

<*>.Length } } > c:\hardlinks.txt
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top