我的问题是几乎回答者这个问题的答案,但是在搜索整个系统驱动器时,建议的命令会吐出许多错误消息,关于:某些系统文件夹无法访问。
那么,有什么方法可以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
。 试一试,看看它是否有帮助 - 如果您的公钥设置不同,您只需替换引号内的字符串即可。