Проверить в коде PowerShell, является ли папка точкой соединения? - PullRequest
5 голосов
/ 22 февраля 2010

Как проверить в коде PowerShell, если папка является точкой соединения?

Ответы [ 6 ]

5 голосов
/ 24 июля 2013

If (Get-Item Тестовая папка ). Attributes.ToString (). Contains ("ReparsePoint") { Код }

5 голосов
/ 22 февраля 2010

Посмотрите на этот блог: http://blogs.msdn.com/powershell/archive/2010/02/10/viewing-junctions-with-dir.aspx

способ сделать это - скопировать файл форматирования встроенной файловой системы, изменить его так, чтобы указывались места соединения, затем загрузить его с Update-FormatData :

Из блога:

Правила форматирования файловой системы в $pshome\FileSystem.Format.ps1xml. я скопировал это, то в элемент [ViewDefinitions –> View –> TableControl –> TableRowEntries –> TableRowEntry –> TableColumnItems –> TableColumnItem] Я изменил содержание PropertyName со значением 'Mode' на следующее:

<ScriptBlock> 
   "$($_.Mode)$(if($_.Attributes -band [IO.FileAttributes]::ReparsePoint)
{'J'})" </ScriptBlock> 

Это делает побитовое И на Атрибуты объекта DirectoryInfo собственность ($_.Attributes) против .Net System.IO.FileAttributes.ReparsePoint enum value. Если результат не равен нулю, он отображает «J» рядом с другим Атрибуты режима файла. Затем загрузите новый файл форматирования, подобный этому:

 PS> Update-FormatData -PrependPath myFilesystem.format.ps1xml

Параметр PrependPath гарантирует, что новый файл форматирования загружен до встроенного форматирования файлов.

В каталоге alink есть буква "J" колонка, похоже на работу!

Это в столбце Режим J для Junction.

2 голосов
/ 27 июля 2018

Поскольку, по крайней мере, PowerShell v5.0, улучшена поддержка ссылок (или, как их называет MS: Reparse Points)

улучшенные командлеты элементов - LinkType свойство

Связанная статья относится к категории WMF 5.0, что может означать, что этот метод был доступен начиная с PS v5.0.
Эти функции были включены в стандартный Get-Item, Get-ChildItem, поэтому никаких дополнительных действий не требуется. Может использоваться на любом текущем PS.

LinkType - это свойство String объекта, возвращаемое Get-Item и Get-ChildItem,
он может иметь одно из следующих четырех значений: '', 'Junction', 'SymbolicLink', 'HardLink'.

Чтобы ответить на вопрос OP, вы можете проверить, является ли папка точкой соединения, используя:

if ((Get-Item -Path $Target -Force).LinkType -eq "Junction") { }

Чтобы проверить, является ли файл / папка «ReparsePoint» любого вида (Junction, SymbolicLink или HardLink):

if ((Get-Item -Path $Target -Force).LinkType) { }

Значение LinkType для обычного файла / папки представляет собой пустую строку, которая при использовании в качестве , если условие в PS преобразуется в False


Get-ChildItem может использоваться для вывода списка всех папок Junction:

(Get-ChildItem -Path $Target -Force) | Where-Object { $_.LinkType -eq "Junction" }

Обратите внимание, что значение SymbolicLink одинаково для файла или папки, поэтому перечислять только символические ссылки на папки:

(Get-ChildItem -Path $Target -Directory -Force) | Where-Object { $_.LinkType -eq "SymbolicLink" }


Командлет Get-ChildItem (псевдоним: dir, ls, gci) теперь отображает атрибут ReparsePoint как l в столбце Mode без каких-либо расширений. Но он не будет отображать 'HardLink' и отображает l для Junction и SymbolicLink:

> Get-ChildItem -Path $Target -Force


    Directory: C:\Users


Mode                LastWriteTime         Length Name                          
----                -------------         ------ ----                          
d--hsl       2018-04-12     01:45                All Users                     
d-rh--       2018-05-09     06:12                Default                       
d--hsl       2018-04-12     01:45                Default User                  
d-----       2018-06-24     03:05                Papo                          
d-r---       2018-07-27     07:12                Public
  • LinkType не работает с папками со специальными разрешениями внутри \ Users и \ Users \, хотя Get-ChildItem, как показано выше, работает и показывает l на них.
  • Remove-Item имеет проблемы. Он не может удалить Junction, и если принудительно, удалит оригинальное содержимое с ним. Это, как говорят, будет исправлено в будущей версии PS v6

Использование этих улучшенных или сегодняшних стандартных командлетов имеет некоторые преимущества перед предыдущими методами, описанными в более старых ответах здесь.

  • Различает соединение и символическую связь
    Если OP хотел проверить, является ли папка Junction, проверка по свойству Attribute приведет к ложному срабатыванию для папки Symbolic Link.

  • обнаруживает жесткую ссылку.

  • LinkType является [String] в отличие от свойства Attributes, которое имеет тип [FileAttributes] и нуждается в .ToString () или использовании -band

1 голос
/ 22 февраля 2010

К вашему сведению, если вы используете Расширения сообщества PowerShell , эта информация доступна как вывод (и как свойство заметки) при выводе Get-ChildItem:

21> gci .\Roaming\Microsoft\eHome


    Directory: Microsoft.PowerShell.Core\FileSystem::C:\Users...


Mode           LastWriteTime       Length Name
----           -------------       ------ ----
d----     2/15/2010 12:18 AM        <DIR> DvdCoverCache
d----      8/9/2009  1:10 AM    <SYMLINK> DvdInfoCache [\...
d----      8/8/2009 11:51 PM        <DIR> DvdInfoCache.orig
d----    10/22/2009  7:12 PM        <DIR> mcl_images

Однако для программного доступа я бы получал доступ к информации через свойство Attributes, как предлагает другой автор.

0 голосов
/ 06 апреля 2018

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

$TargetAttributes = (Get-Item -Path $Target -Force).Attributes.ToString()
if ($TargetAttributes -match "ReparsePoint") {
    if ($TargetAttributes -match "Archive") {
        Write-Output ("Link to a file.")
    } else {
        Write-Output ("Link to a folder.")
    }
} else {
    Write-Output ("Normal File or Folder.")
}    
0 голосов
/ 23 июня 2011

Если у вас есть PowerShell Community Extensions, которые я бы порекомендовал, если вы работаете с переходами, вы можете сделать следующее, чтобы определить, является ли папка переходом:

Import-Module pscx
if ((Get-Item *test_folder*).ReparsePoint){
    Write-Host "YES"
}
...