如果文件夹是联结点,我如何在PowerShell代码中测试?
答案 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
)反对 .NetSystem.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
l
。使用这些改进的或当今的标准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.")
}