Ser*_*ver 5 powershell ntfs junction
如果文件夹是联结点,我如何在PowerShell代码中进行测试?
至少从 PowerShell v5.0 开始,对链接有更好的支持(或者 MS 称之为:Reparse Points)
链接文章属于 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)
l在它们上显示。使用这些改进的或今天的标准 Cmdlet 比以前的方法有一些优势,在此处的旧答案中进行了描述。
它确实区分了 Junction 和 Symbolic Link
如果 OP 想要测试文件夹是否是 Junction,则通过 Attribute 属性检查将导致文件夹 Symbolic Link 的误报。
检测硬链接。
LinkType 是 [String] 而不是 Attributes 属性,它是 [FileAttributes] 类型并且需要 .ToString() 或使用 -band
看一下这个博客: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'的值,如下所示:Run Code Online (Sandbox Code Playgroud)<ScriptBlock> "$($_.Mode)$(if($_.Attributes -band [IO.FileAttributes]::ReparsePoint) {'J'})" </ScriptBlock>这对DirectoryInfo对象Attributes属性(
$_.Attributes)执行与.NetSystem.IO.FileAttributes.ReparsePoint枚举值的按位AND .如果结果不为零,则在其他文件模式属性旁边显示"J".接下来,加载新的格式文件,如下所示:Run Code Online (Sandbox Code Playgroud)PS> Update-FormatData -PrependPath myFilesystem.format.ps1xml该PrependPath参数确保新格式文件的内置格式设置文件之前加载.
目录alink在模式列中有一个'J',似乎有效!
它位于模式列J中,用于连接.
小智 5
If(Get-Item Test Folder).Attributes.ToString().Contains("ReparsePoint"){ Code }
| 归档时间: |
|
| 查看次数: |
6802 次 |
| 最近记录: |