The Problem
I was recently tasked with sifting through years of stuff that had built up on one of the Windows servers at work and removing that which was no longer required. As a developer, this largely meant clearing out the local instance of SQL Server (tables, views, stored procs, functions, SSIS packages and jobs), but also there were a lot of batch (.bat) files and SQL (.sql) files knocking about.
These files needed cataloguing before I archived any of them as I knew that some were still in use. SQL Server wasn’t a problem as there are various system stored procedures to return a list of various entities, but how was I going to get a list of files that were scattered and buried in the ageing directory structure?
I tried using the Windows Explorer search function, but it was so hit and miss that I couldn’t rely upon it.
I thought maybe I could knock up an ASP.Net page to trawl through the folders and give me a list. Sure I could do this (I recall doing it with Classic ASP many moons ago), but then I remembered about PowerShell.
PowerShell
I’d only recently heard of PowerShell and seen some script and was impressed with what could be achieved, but I hadn’t had a real reason to use it. Basically, PowerShell is a powerful scripting tool that sits under the Windows GUI and allows the user to perform all sorts of magical tasks. I won’t go into detail here, so take a look at this: What can I do with PowerShell? Surely it could perform some basic file filtering and output the list. I wasn’t wrong.
Get To The Point
This is all you need to do:
Get-ChildItem C:\ -Recurse | Where {$_.extension -eq “.bat”} | ForEach-Object { $_.FullName } > C:\File.txt
Here’s how to paste script into PowerShell.
Break It Down
I’m not going to pretend that I know exactly what the switches do, but here’s a quick breakdown of the script:
- The script is broken up by the pipes (|)
- Get-ChildItem C:\ returns all files within the root of C:. The drive letter can be changed
- -Recurse loops through all of the subdirectories C: and returns the files in those subdirectories too. How simple is that? I love it!
- Where {$_.extension -eq “.bat”} only returns files with a .bat file extension. You can omit this if you want to return all file types
- ForEach-Object { $_.FullName } returns the full path of each file, including the drive letter
- > C:\File.txt chucks the results into a text file with a name and location of your choice. You can omit this to display the output within the PowerShell window instead
Bish, bash, bosh, job done!