Узнайте, является ли файл символической ссылкой в PowerShell
-
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