Powershell/Cmd:查找具有特定扩展名的文件,排除因无法访问而导致的错误消息

Powershell/Cmd:查找具有特定扩展名的文件,排除因无法访问而导致的错误消息

我的问题是几乎回答者这个问题的答案,但是在搜索整个系统驱动器时,建议的命令会吐出许多错误消息,关于:某些系统文件夹无法访问。

那么,有什么方法可以gci -Path "C:\" -Recurse | where {$_.Name -like '*.txt'}返回 C: 上的所有 txt 文件,而忽略无法访问的文件夹?

我还会接受任何指向替代 cmd 或 powershell 命令的答案,这些命令可以有效地执行相同的操作。MTIA!:-)

更新:对于大家的负面评论,我深表歉意,显然我没有测试过这个精确的我也没有解释我真的想要(请参阅下面 Mael 的评论以及我的回复)。

我正在尝试自动完成设置 SSH 客户端的过程,并希望在不必要地创建新密钥之前搜索系统上已存在的任何/所有公钥。因此,我使用的扩展实际上搜索的是.pub,而不是.txt!

我最初说 .txt 是因为我认为它会更清晰、更容易测试,而不会影响结果……显然我错了!但为什么呢?理想情况下,我搜索的命令应该适用于任何文件扩展名(*.ext不是 *.ext*),并且不会像 那样产生假阳性<left part of file or folder name><extension><right part of name>

再次感谢大家!:-)

答案1

PowerShell:简短版本:

gci C:\ *.pub -file -ea silent -recurse

完整版本:

Get-ChildItem -path C:\ -filter *.pub -file -ErrorAction silentlycontinue -recurse

答案2

我更喜欢用for循环来实现这一点:

for /r "c:\" %A in (*.txt) do (echo %A)

for /r循环遍历c:\的所有子文件夹c:\,每次迭代都会为参数分配一个文本文件%A,然后%A在命令窗口中回显,或者您可以将(echo %%A>>sometextfile.txt)结果传输到文本文件中。

参考:为了


根据评论更新信息:
我无法复制您的问题 - 我将一堆文件(Microsoft Publisher 文件、添加了 .pub 扩展名的公钥、私钥、文本文件等,所有文件都有各种名称,即“no.pub.txt”、“thanks ok.pub”、“maybe a.pub.ppk”等)放入一堆文件夹中(还包括“pub”、“.pub”等),然后运行脚本,它只返回带有 .pub 扩展名的文件 - 不管这些文件是否真的是可用的 .pub。

据我有限的理解,公共 SSH 密钥始终包含特定的字符串(我假设基于它们的生成方式,但我只使用过 PuTTy) - 因此让我们尝试嵌套一个使用以下内容的循环findstr

@echo off

for /r "c:\" %%A in (*.pub) do (
    for /f "delims= tokens=*" %%B in ('findstr /i /c:"BEGIN SSH2 PUBLIC KEY" "%%A"') do (
        echo %%A
    )
)

pause

这将循环c:\并提取您for /r返回的所有内容*.pub- 由于某些原因这对您来说不可靠,我们将其嵌套以for /f遍历这些结果并提取包含字符串的所有内容BEGIN SSH2 PUBLIC KEY,之后我们回显原始参数%%A。 试一试,看看它是否有帮助 - 如果您的公钥设置不同,您只需替换引号内的字符串即可。

参考:查找字符串对于/r对于/f

相关内容