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

有帮助吗?

解决方案

看看这个博客: HTTP://blogs.msdn。 COM /的powershell /存档/ 2010/02/10 /观看结与 - dir.aspx

要做到这一点的方法是复制内置的文件系统格式的文件,对它进行修改,使得结指示,则与加载它更新-FormatData将

从博客:

  

在文件系统的格式化规则是   在$pshome\FileSystem.Format.ps1xml。一世   复制此,然后在元件   [ViewDefinitions –> View –> TableControl –> TableRowEntries –> TableRowEntry –> TableColumnItems –> TableColumnItem]   我改变了内容   的的PropertyName 使用 '模式' 的值   以下内容:

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

此执行按位与上   DirectoryInfo对象属性   财产($_.Attributes)反对   净System.IO.FileAttributes.ReparsePoint   枚举值。如果结果不为零,   它显示一个“J”旁的其他   文件模式属性。接下来,加载   新格式化文件是这样的:

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

PrependPath 参数可确保   新的格式文件被加载   前内置的格式化的文件。

     

指南ALINK具有在模式“J”时   列,似乎工作!

     

这是在模式J列于   结。

其他提示

如果(GET-项目的测试文件夹的)。Attributes.ToString()。包含( “ReparsePoint”){代码的}

至少从 PowerShell v5.0 开始,对链接有了更好的支持(或者 MS 称之为:重新分析点)

改进的 Item cmdlet - 链接类型 财产

链接的文章位于 WMF 5.0 类别下,这可能意味着该方法自 PS v5.0 起可用。
这些功能包含在标准 Get-Item、Get-ChildItem 中,因此不需要额外的步骤。它可以在任何当前的 PS 上使用。

LinkType 是对象的 String 属性,由 Get-Item 和 Get-ChildItem 返回,
它可以具有以下四个值之一:''、'连接点'、'符号链接'、'硬链接'。

要回答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" }


Cmdlet Get-ChildItem(别名:dir、ls、gci) 现在显示 ReparsePoint 属性,如下所示 l 在模式列中,没有任何扩展名。但它不会显示“硬链接”并显示 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 在他们。
  • 删除项目有问题。它无法删除 Junction,如果强制,将删除原始内容。据说这个问题将在未来版本 PS v6 中修复

使用这些改进的或当今的标准 Cmdlet 比以前的方法具有一些优势,如此处较旧的答案中所述。

  • 它确实区分了连接和符号链接
    如果OP想要测试文件夹是否是连接点,则通过属性属性检查将导致文件夹符号链接误报。

  • 检测到硬链接。

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

仅供参考,如果你碰巧运行 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

然而,对于编程访问我将通过作为其他海报暗示属性属性来访问信息。

如果您有PowerShell的社区扩展,我会建议,如果你是结工作,你可以做以下,以确定是否一个文件夹是结还是不:

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

尝试这种情况:

$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.")
}    
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top