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

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

7 ответов

Решение

Посмотрите на этот блог: 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.

Теперь PowerShell имеет свойство LinkType
Связанная статья относится к категории WMF 5.0, поэтому этот метод, вероятно, доступен начиная с PS v5.0.

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

Это свойство имеет тип [String], в отличие от свойства Attributes типа [FileAttributes].
Нет необходимости в.ToString() или использовании -band

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

Чтобы проверить "ReparsePoint", является ли элемент любым из Junction, SymbolicLink или HardLink:

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

(*) это работает, потому что для обычных файлов / папок LinkType является пустой строкой


или перечислить все папки 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 без каких-либо расширений:

> 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

(*) Это не найдет HardLink, а показывает l для Junction и SymbolicLink

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

К вашему сведению, если вы используете PowerShell Community Extensions, эта информация доступна как вывод (и как свойство заметки) при выводе 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, как предлагает другой автор.

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

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

Пример исключения Junction из списка (или "-match", чтобы исключить все остальные):

      (Get-ChildItem -Force | where {$_.PSIsContainer -eq $true -And $_.Attributes -notmatch "Reparse"})

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

$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.")
}    
Другие вопросы по тегам