在 PowerShell 代码中测试文件夹是否是连接点?
-
22-09-2019 - |
题
如何在 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 称之为:重新分析点)
链接的文章位于 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.")
}