1

So far I run a .bat file to find all the media files stored on our student shared drive, which then writes to a .txt file in my documents, for example:

dir S:*.mp3 /s > "M:\logs\student\mp3.txt"

This is probably not the best way of doing it and I am aware there are probably better tools in 2008 R2 to do this for me. I am now trying to find a way to only log files that are, for example, bigger then 100mb. Is this doable in a .bat files/cmd.exe, am I better off using PowerShell, or use the fuctions in Server 2008R2?

tombull89
  • 2,964
  • 8
  • 41
  • 52

3 Answers3

1

You're better off using find.

Ignacio Vazquez-Abrams
  • 45,939
  • 6
  • 79
  • 84
1

PowerShell or VBScript are the way to go. I've tried what you're doing with Shell script, and you end up doing a lot of for() and findstr calls, stripping commas from sizes, Etc.

VBScript has the FileSystemObject - do a google.

PowerShell has get-childitem:

Get-childitem -LiteralPath <basepath> -Filter *.mp3 -recurse -erroraction silentlycontinue | where-object{ $_.length -gt 100MB }

The above scans the path <basepath> and all subdirs for MP3s > 100MB.

You can then add to the "pipeline":

| foreach-object{ //dosomething }

The powershell on-line help is very good; try: get-help get-childitem -detailed for example.

Happy scripting!

Oh, and don't forget that Win2k8 has "File Server Resource Manager" - a great tool.

Simon Catlin
  • 5,232
  • 3
  • 17
  • 20
  • Besides, you may want to use an actual PowerShell comment instead of a C++ one ;-) – Joey Nov 09 '10 at 12:08
  • C++ ? Confused, I am. – Simon Catlin Nov 09 '10 at 20:17
  • You've given the code snippet `| foreach-object{ //dosomething }` which – for PowerShell – might read `| foreach-object{ <# dosomething #> }`. At least I thought it to be customary to use the language's own comment marker for such things ;) – Joey Nov 09 '10 at 21:17
  • Ah. Point taken. You're more of a pedant than me (and that's saying something!) ;-) – Simon Catlin Nov 09 '10 at 21:47
1
@echo off
rem only files bigger than %threshold% MB are listed
set threshold=100

for /r %%F in (*) do call :foo %%~zF "%%F"
goto :eof

:foo
set size=%1
set size_mb=%size:~0,-6%
if not defined size_mb set size_mb=0
if %size_mb% GTR %threshold% echo.%~2
goto :eof

The subroutine is sadly necessary since delayed expansion didn't want the way how I extracted the megabytes (yes, indeed, megabytes, not mebibytes – I don't like it either, but it's the easiest here).

Note that this approach will fail for files larger than roughly two exabytes since cmd cannot do a numeric comparison with values that won't fit into a signed 32-bit integer.

The code can also be found in my SVN repository.

Joey
  • 1,853
  • 11
  • 13
  • *chuckle* Thanks, although if a student has 1 million terabytes worth of stuff I think we'd notice long before me using this. – tombull89 Nov 09 '10 at 13:58