0

My question is almost answered by this question answer, but the command suggested there spits out many error messages re: the inaccessibility of certain system folders when searching the entire system drive.

So, is there any way to make gci -Path "C:\" -Recurse | where {$_.Name -like '*.txt'} return all txt files on C:, ignoring inaccessible folders?

I would also accept any answer that points to an alternative cmd or powershell command that effectively does the same thing. MTIA! :-)

UPDATE: Apologies for the negative comments guys, I obviously didn't test out this exact scenario properly, nor did I explain what I really want (see Mael's comment below and my replies to it).

I am trying to automate the process of setting up an SSH client, and want to search for any/all public keys that already exist on the system before I go unnecessarily creating new ones. So the extension that I'm actually searching for is .pub, not .txt!

I originally said .txt coz I thought it would be clearer and easier to test, without effecting the results...obviously I was wrong! But why?? Ideally, the command that I'm searching for would work with any file extension (i.e. *.ext, not *.ext*), and not produce false positives like <left part of file or folder name><extension><right part of name>.

Thanks again everyone! :-)

Kenny83
  • 270

2 Answers2

3

PowerShell: Short version:

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

Full version:

Get-ChildItem -path C:\ -filter *.pub -file -ErrorAction silentlycontinue -recurse
Skusku
  • 103
Keith Miller
  • 10,694
  • 1
  • 20
  • 35
0

I prefer for loops for this:

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

This for /r loop goes through c:\ and all subfolders of c:\, each iteration will assign a text file to parameter %A, then echo %A in the command window, or you can make it (echo %%A>>sometextfile.txt) to pipe the results into a text file.

Reference: For


Updated with Information from Comments:
I've been unable to replicate your issue - I threw a bunch of files (Microsoft Publisher files, public keys with a .pub extension added to them, private keys, text files, etc. all with various names i.e. "no.pub.txt", "thanks ok.pub", "maybe a.pub.ppk", etc.) into a bunch of folders (also included "pub", ".pub", etc.) and ran the script and it only ever returned the files with a .pub extension - whether those were actually working .pubs or not.

From my limited understanding, public SSH keys always contain specific strings (I assume based on how they are generated, but I only have experience with PuTTy) - so let's try nesting a loop that uses 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

This loops through c:\ and pulls out everything your for /r returns for *.pub - since this is unreliable for you for some reason, we nest it with for /f to go through those results and pull out everything that contains the string BEGIN SSH2 PUBLIC KEY, after which we echo our original parameter %%A. Give that a shot and see if it helps - if your public keys are setup differently you can just replace the string within the quotes.

Reference: Findstr, for /r, for /f

mael'
  • 1,946