如何使Get-ChildItem不跟随链接

时间:2015-04-21 05:36:52

标签: powershell

我需要Get-ChildItem来返回路径中的所有文件/文件夹。但是也有符号链接到远程服务器。链接由以下内容创建:mklink /D link \\remote-server\folder

如果我运行Get-ChildItem -recurse,它会跟随指向远程服务器的链接并列出所有文件/文件夹。如果我使用-exclude,它不会列出与排除模式匹配的文件夹,但仍然会关闭并列出所有包含的文件和文件夹。

我真正需要的是Get-ChildItem -recurse完全忽略链接而不是跟随它们。

3 个答案:

答案 0 :(得分:1)

您可以使用如下命令排除链接:

gci <your path> -Force -Recurse -ErrorAction 'silentlycontinue' | 
Where { !($_.Attributes -match "ReparsePoint") }

阅读评论后:你不能分两步完成吗?

$excluded = @(gci <your path> -Force -Recurse -ErrorAction 'silentlycontine' | where { ($_.Attributes -match "ReparsePoint") )

get-childitem -path <your path> -recurse -exclude $excluded

答案 1 :(得分:0)

我自己也需要同样的东西。定居于...

String givenWord = // from user
List<String> wordArrayList = sentence.split(" ").stream.filter(str -> str.contains(givenWord)).collect(Collectors.toList())

打印路径的所有子项(包括符号链接/结),但递归时将不跟随符号链接/结。

并不需要Function Get-ChildItemNoFollowReparse { [Cmdletbinding(DefaultParameterSetName = 'Path')] Param( [Parameter(Mandatory=$true, ParameterSetName = 'Path', Position = 0, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)] [ValidateNotNullOrEmpty()] [String[]] $Path , [Parameter(Mandatory=$true, ParameterSetName = 'LiteralPath', Position = 0, ValueFromPipelineByPropertyName=$true)] [ValidateNotNullOrEmpty()] [Alias('PSPath')] [String[]] $LiteralPath , [Parameter(ParameterSetName = 'Path')] [Parameter(ParameterSetName = 'LiteralPath')] [Switch] $Recurse , [Parameter(ParameterSetName = 'Path')] [Parameter(ParameterSetName = 'LiteralPath')] [Switch] $Force ) Begin { [IO.FileAttributes] $private:lattr = 'ReparsePoint' [IO.FileAttributes] $private:dattr = 'Directory' } Process { $private:rpaths = switch ($PSCmdlet.ParameterSetName) { 'Path' { Resolve-Path -Path $Path } 'LiteralPath' { Resolve-Path -LiteralPath $LiteralPath } } $rpaths | Select-Object -ExpandProperty Path ` | ForEach-Object { Get-ChildItem -LiteralPath $_ -Force:$Force if ($Recurse -and (($_.Attributes -band $lattr) -ne $lattr)) { Get-ChildItem -LiteralPath $_ -Force:$Force ` | Where-Object { (($_.Attributes -band $dattr) -eq $dattr) -and ` (($_.Attributes -band $lattr) -ne $lattr) } ` | Get-ChildItemNoFollow -Recurse } } } } 的所有功能,因此也不需要编写它们,但是如果您只需要Get-ChildItem和/或-Recurse,这主要是一个简单的操作,替换。

(已简短地)在Windows 7和2012的PSv2和PSv4中进行了测试。无保修等。

(PS:仇恨 -Force在这种情况下...)

答案 2 :(得分:0)

您实际上可以这样做:

get-childitem -recurse -attributes !reparsepoint

好吧,这将排除链接本身,但不排除Powershell 5.1中通过-recurse获取的链接下方的文件。

| where attributes -notmatch reparsepoint

实际上,它可以在Powershell 6中正常工作。