如何使用PowerShell进行区分大小写的文件搜索?

4
Get-ChildItem -Path C:\ -Filter CAPS*

查找caps.txt

我希望确保它只会查找CAPS.txt(或例如CAPS901918.whatever

我试图找到将过滤器传输到表达式的方法,例如:

{ $_.What_I_just_said_to_filter_on -like [A-Z] }

或者在收到结果后抑制输出,但我什么也没发现。

1
如果您想查看子目录,请不要忘记使用“-Recurse”。 “-Force”将获取隐藏和系统文件。此外,请从提升的提示符中运行此命令,否则使用“-Recurse”可能会出现许多错误。 - Matt
4个回答

10

尝试像这样将Get-Childitem管道连接到Where-Object

Get-Childitem -Path C:\ | Where-Object {$_.what_you_want_to_filter -cmatch "REGEX"}

这里有一些类似语法的代码(感谢FLGMwt)

Get-Childitem -Path C:\ | Where-Object {$_.Name -clike "CAPS*"}

6
请注意,-match 需要使用正则表达式匹配。另外,如果您更喜欢 like 语法,则可以使用 -clike 来强制区分大小写。 - FLGMwt
3
使用 -cmatch 进行区分大小写的匹配。 - Shaun Luttin

6

文件系统提供程序的过滤器不区分大小写,但您可以将其管道传递给以下内容:

Where{-NOT ($_.BaseName -cmatch "[a-z]")}

这将查找不包含小写字母的文件。如果匹配大写字母,则适用于至少有一个大写字母的任何文件,并且仍然可以包括小写字母。


3
您可以使用正则表达式选项来实现此功能。
| Where{ $_.BaseName -match "(?-i)^[A-Z]+") }

或者

| Where{ $_.BaseName -cmatch "^[A-Z]+"}

2

如果您感兴趣,这是我编写的一个不错的PowerShell应用程序,用于搜索并将找到的项目输出到桌面上的日志文件中。

# Creates Log File
function Create-MyLog()
{
    Clear-Host
    New-Item -Path "C:\Users\$env:USERNAME\Desktop\" -Name "MyLogFile.txt" -ItemType file -Force
    Clear-Host
    Smart-Search
}

# Gather Search And Execute
function Smart-Search()
{   
    Clear-Host
    $LogFilePath = "C:\Users\$env:USERNAME\Desktop\"
    $TestInput = Read-Host 'What Would You Like To Search'
    $TestSearch = $TestInput + "*"
    $MyLogFile = ($LogFilePath + "MyLogFile.txt")
    Set-Location "C:\"
    $itemSum = Get-ChildItem -Recurse -ErrorAction SilentlyContinue
        Foreach($itemInst in $itemSum)
            {
                if(($itemInst.Name -clike $TestSearch) -eq $true)
                    {
                        $itemInst.FullName | Out-File -LiteralPath $MyLogFile -Append
                    }
                elseif($itemInst -eq $null)
                    {
                        Write-Host "Search Error On searchInst Is Null"
                    }
            }
        Search-Again
}

# Ask If User Wants To Search Again
function Search-Again()
{
    $userAnswer = Read-Host 'Would You Like To Search Again? y/n'
        switch($true)
            {
                ($userAnswer -eq "y"){Smart-Search};
                ($userAnswer -eq "n"){};
                default{Write-Host "Invalid Response"; Search-Again};
            }
}
Create-MyLog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接