在 PowerShell 代码中测试文件夹是否是连接点?
如何在 PowerShell 代码中测试文件夹是否是连接点?
How can I test in PowerShell code if a folder is a junction point?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
如何在 PowerShell 代码中测试文件夹是否是连接点?
How can I test in PowerShell code if a folder is a junction point?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(7)
至少从 PowerShell v5.0 开始,对链接有了更好的支持(或者 MS 称之为:重新分析点)
改进的 Item cmdlet - LinkType 属性
链接的文章位于 WMF 5.0 类别下,这可能意味着该方法自 PS v5.0 起可用。
这些功能包含在标准 Get-Item、Get-ChildItem 中,因此不需要额外的步骤。它可以在任何当前的 PS 上使用。
LinkType 是对象的字符串属性,由 Get-Item 和 Get-ChildItem 返回,
它可以具有以下四个值之一:''、'Junction'、'SymbolicLink'、'HardLink'。
要回答OP的问题,您可以使用以下方法检查文件夹是否是连接点:
要检查文件/文件夹是否是任何类型的“ReparsePoint”(连接点、符号链接或硬链接):
普通文件/文件夹上的 LinkType 值是空字符串,在 PS 中用作 if 条件时解析为 False
Get-ChildItem 可用于列出所有 Junction 文件夹:
请注意,文件或文件夹的“SymbolicLink”值相同,因此仅列出文件夹的符号链接:
Cmdlet Get-ChildItem(别名:dir、ls、gci)现在显示 ReparsePoint 属性,如模式列中的
l
,不带任何扩展名。但它不会显示“HardLink”,并显示 Junction 和 SymbolicLink 的l
:l
。使用这些改进的或今天的标准 Cmdlet,比以前的方法具有一些优势,如此处较旧的答案中所述。
它确实区分了连接和符号链接
如果OP想要测试文件夹是否是Junction,则通过属性属性检查将导致文件夹符号链接误报。
检测到硬链接。
LinkType 是 [String],而不是 Attributes 属性,后者是 [FileAttributes] 类型,需要 .ToString() 或使用 -band
Since at least PowerShell v5.0, there is better support for links (or as MS calls them: Reparse Points)
improved Item cmdlets - LinkType property
Linked article is under WMF 5.0 category, which might mean that the method was available since PS v5.0.
These features were included in standard Get-Item, Get-ChildItem, so there are no additional steps required. It can be used on any current PS.
LinkType is a String property on an Object, returned by Get-Item and Get-ChildItem,
it can have one of the following four values: '', 'Junction', 'SymbolicLink', 'HardLink'.
To answer OP's question, you can check if a folder is a junction point using:
To check if a file/folder is a "ReparsePoint", of any kind (Junction, SymbolicLink or HardLink):
LinkType value on ordinary file/folder is an empty String, which when used as if condition in PS resolves to False
Get-ChildItem can be used to list all Junction folders:
Note that value 'SymbolicLink' is the same for both file or folder, so to list only Symbolic links to folders:
Cmdlet Get-ChildItem (alias: dir, ls, gci) now shows ReparsePoint attribute, as
l
in Mode column, without any extension. But it will not show 'HardLink' and showsl
for both Junction and SymbolicLink:l
on them.Using these improved, or today's standard Cmdlets, has some advantages over previous methods, described in older answers here.
It does differentiate between Junction and Symbolic Link
If OP wanted to test if folder is a Junction, checking by Attribute property would result in false positive for folder Symbolic Link.
detects Hard Link.
LinkType is [String] as opposed to Attributes property, which is [FileAttributes] type and needs .ToString() or a use of -band
If (Get-Item 测试文件夹).Attributes.ToString().Contains("ReparsePoint"){代码}
If (Get-Item Test Folder).Attributes.ToString().Contains("ReparsePoint"){Code}
看看这个博客:
https:// /web.archive.org/web/20190422210654/https://devblogs.microsoft.com/powershell/viewing-junctions-with-dir/
方法是复制内置文件系统格式化文件,修改它以便指示连接,然后使用 Update-FormatData 加载它:
来自博客:
Take a look at this blog:
https://web.archive.org/web/20190422210654/https://devblogs.microsoft.com/powershell/viewing-junctions-with-dir/
the way to do it is to copy the built in file system formatting file, modify it so that junctions are indicated, then load it with Update-FormatData:
From the Blog:
仅供参考,如果您碰巧正在运行 PowerShell 社区扩展,此信息可作为输出(以及注释属性) )在 Get-ChildItem 的输出上:
但是,对于编程访问,我将按照其他海报的建议通过 Attributes 属性访问信息。
FYI, if you happen to be running PowerShell Community Extensions, this info is available as output (and as a note property) on output of Get-ChildItem:
However for programmatic access I would access the info via the Attributes property as the other poster suggests.
如果您拥有我推荐的 PowerShell 社区扩展(如果您正在使用联结),您可以执行以下操作来确定文件夹是否是联结:
If you have the PowerShell Community Extensions which I would recommend if you are working with junctions you can do the following to determine if a folder is a junction or not:
试试这个:
Try this:
从列表中排除 Junction 的示例(或“-match”,用于排除所有其他):
Example for exclude Junction from listing (or "-match", for exclude all another):