代码之家  ›  专栏  ›  技术社区  ›  Serge van den Oever

在PowerShell代码中测试文件夹是否为连接点?

  •  4
  • Serge van den Oever  · 技术社区  · 16 年前

    如果文件夹是连接点,如何在PowerShell代码中进行测试?

    6 回复  |  直到 16 年前
        1
  •  5
  •   NewSites    6 年前

    看看这个博客: https://web.archive.org/web/20190422210654/https://devblogs.microsoft.com/powershell/viewing-junctions-with-dir/

    方法是复制内置的文件系统格式化文件,修改它以指示连接,然后用 更新FormatData

    来自博客:

    文件系统格式规则是 在里面 $pshome\FileSystem.Format.ps1xml . 我 复制了这个,然后在元素中 [ViewDefinitions –> View –> TableControl –> TableRowEntries –> TableRowEntry –> TableColumnItems –> TableColumnItem] 属于 属性名 值为“Mode” 以下内容:

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

    DirectoryInfo对象属性 财产( $_.Attributes .Net System.IO.FileAttributes.ReparsePoint 文件模式属性。接下来,加载

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

    这个 参数确保 将加载新的格式文件 在内置格式文件之前。

    目录alink在模式中有一个J

    它在模式栏J中

        2
  •  6
  •   USMCDragon75    13 年前

    If(获取项目) 测试文件夹 ).Attributes.ToString().Contains(“ReparsePoint”){ }

        3
  •  6
  •   NewSites    6 年前

    由于至少是PowerShellV5.0,所以对链接(或者MS称之为:重分析点)的支持更好

    improved Item cmdlets - LinkType property

    链接文章属于WMF 5.0类别,这可能意味着该方法自PS v5.0起就可用。

    LinkType是对象的字符串属性,由Get Item和Get ChildItem返回,
    它可以具有以下四个值之一:''Junction','symbolicink','HardLink'。

    要回答OP的问题,可以使用以下方法检查文件夹是否为连接点:

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

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

    普通文件/文件夹上的LinkType值为空字符串,当用作 如果


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

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


    Cmdlet Get ChildItem(别名:dir,ls,gci)现在显示ReparsePoint属性,如下所示 l 在模式列中,不带任何扩展名。但它不会显示“硬链接”和 L

    > 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 在他们身上。
    • 删除项目有问题。它不能删除连接,如果强制,它将删除原始内容。据说这在未来版本的PS v6中是固定的

    • 它确实区分了连接和符号链接

    • 检测硬链接。

    • LinkType是[String],而Attributes属性是[FileAttributes]类型,需要.ToString()或-band的用法

        4
  •  1
  •   Keith Hill    16 年前

    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属性访问信息,正如另一张海报所建议的那样。

        5
  •  0
  •   Mxyk Edda    13 年前

    如果您有PowerShell社区扩展,我建议您使用连接,您可以执行以下操作来确定文件夹是否为连接:

    Import-Module pscx
    if ((Get-Item *test_folder*).ReparsePoint){
        Write-Host "YES"
    }
    
        6
  •  0
  •   Ralph Lee    8 年前

    试试这个:

    $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.")
    }