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

Ser*_*ver 5 powershell ntfs junction

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

pap*_*apo 6

至少从 PowerShell v5.0 开始,对链接有更好的支持(或者 MS 称之为:Reparse Points)

改进的 Item cmdlet - LinkType属性

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

LinkType 是 Object 上的 String 属性,由 Get-Item 和 Get-ChildItem 返回,
它可以具有以下四个值之一:''、'Junction'、'SymbolicLink'、'HardLink'。

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

if ((Get-Item -Path $Target -Force).LinkType -eq "Junction") { }
Run Code Online (Sandbox Code Playgroud)

要检查文件/文件夹是否为任何类型(Junction、SymbolicLink 或 HardLink)的“ReparsePoint”:

if ((Get-Item -Path $Target -Force).LinkType) { }
Run Code Online (Sandbox Code Playgroud)

普通文件/文件夹上的 LinkType 值是一个空字符串,当在 PS 中用作if条件时,它会解析为 False


Get-ChildItem 可用于列出所有 Junction 文件夹:

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

请注意,文件或文件夹的值 'SymbolicLink' 相同,因此仅列出文件夹的符号链接:

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


Cmdlet Get-ChildItem(别名:dir、ls、gci)现在显示 ReparsePoint 属性,就像l在 Mode 列中一样,没有任何扩展名。但它不会显示“HardLink”并同时显示lJunction 和 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
Run Code Online (Sandbox Code Playgroud)
  • LinkType 不适用于 \Users 和 \Users\ 中具有特殊权限的文件夹,即使如上所示的 Get-ChildItem 确实有效并l在它们上显示。
  • Remove-Item 有问题。它不能删除 Junction,如果强制,将删除它的原始内容。据说这会在未来的版本 PS v6 中修复

使用这些改进的或今天的标准 Cmdlet 比以前的方法有一些优势,在此处的旧答案中进行了描述。

  • 它确实区分了 Junction 和 Symbolic Link
    如果 OP 想要测试文件夹是否是 Junction,则通过 Attribute 属性检查将导致文件夹 Symbolic Link 的误报。

  • 检测硬链接。

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


Chr*_*nes 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> 
Run Code Online (Sandbox Code Playgroud)

这对DirectoryInfo对象Attributes属性($_.Attributes)执行与.Net System.IO.FileAttributes.ReparsePoint 枚举值的按位AND .如果结果不为零,则在其他文件模式属性旁边显示"J".接下来,加载新的格式文件,如下所示:

 PS> Update-FormatData -PrependPath myFilesystem.format.ps1xml
Run Code Online (Sandbox Code Playgroud)

PrependPath参数确保新格式文件的内置格式设置文件之前加载.

目录alink在模式列中有一个'J',似乎有效!

它位于模式列J中,用于连接.


小智 5

If(Get-Item Test Folder).Attributes.ToString().Contains("ReparsePoint"){ Code }

  • 这是唯一不依赖于更改PowerShell配置文件或使用第三方扩展的解决方案.另一个版本是:if((Get-Item Test Folder).Attributes -match [System.IO.FileAttributes] :: ReparsePoint){Code} (2认同)