如果文件夹是联结点,请在PowerShell代码中进行测试?

时间:2010-02-22 13:28:46

标签: powershell ntfs junction

如果文件夹是联结点,我如何在PowerShell代码中测试?

6 个答案:

答案 0 :(得分:5)

看看这个博客: 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> 
     

这是一个按位AND   DirectoryInfo对象属性   属性($_.Attributes)反对   .Net System.IO.FileAttributes.ReparsePoint   枚举值。如果结果不为零,   它在另一个旁边显示'J'   文件模式属性。接下来,加载   像这样的新格式文件:

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

PrependPath 参数确保了这一点   加载新的格式文件   在内置格式化文件之前。

     

目录alink在模式中有一个'J'   专栏,似乎工作!

     

它位于模式列J中   结。

答案 1 :(得分:5)

If(Get-Item 测试文件夹)。Attributes.ToString()。包含(“ReparsePoint”){代码}

答案 2 :(得分:2)

至少从PowerShell v5.0起,对链接有了更好的支持(或如MS所说的那样:解析点)

improved Item cmdlets - LinkType property

链接的文章位于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”(连接,SymbolLink或HardLink):

if ((Get-Item -Path $Target -Force).LinkType) { }
普通文件/文件夹中的

LinkType值是一个空字符串,当在PS中用作 if 条件时,它将解析为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,没有任何扩展名。但是它不会显示'HardLink',并且对于Junction和SymbolicLink都显示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
  • 删除项目有问题。它不能删除Junction,如果强制,它将随之删除原始内容。据说此问题已在将来的PS v6版本中修复

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

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

  • 检测到硬链接。

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

答案 3 :(得分:1)

仅供参考,如果您正在运行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属性访问信息,如另一张海报所示。

答案 4 :(得分:0)

如果您使用的是PowerShell社区扩展,如果您正在使用联结,我可以执行以下操作来确定文件夹是否为交汇点:

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

答案 5 :(得分:0)

试试这个:

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