GWMerrell
asked on
I need a VB or even a Powershell Script that monitors file build up within a folder.
I need a Powersheel Script that monitors file build up within a NTFS folders.
a. If files are discovered, how many files and then run an executable ( BLAT.exe to an email address ).
I'm an admin, not a programmer....so can someone help me write a short script that checks a specified folders, and BLAT.exe emails me the results, I would greatly appreciate it.
a. If files are discovered, how many files and then run an executable ( BLAT.exe to an email address ).
I'm an admin, not a programmer....so can someone help me write a short script that checks a specified folders, and BLAT.exe emails me the results, I would greatly appreciate it.
ASKER
I am looking to find out if any files have been deposited in that directory by the time the script is ran.
Something like this (powershell)
$date = Get-Date $LastTimeItRan
dir $path -rec | ?{$_.LastWriteTime -gt $date}
Say you run the script once a week, you could try something like this. If you wanted to include folders as well as files you can remove $_.PSIsContainer -eq $false -and.
$path = "C:\temp" # edit for the path you want to search
$lastrun = $(Get-Date).AddDays(-7) # adjust the number to look back x amount of days
gci $path -rec | ? {$_.PSIsContainer -eq $false -and $_.LastWriteTime -ge $lastrun} | select name,directory,lastwritetime
Hi, you can use this function to determine the amount of files in the folder as well....
Regards,
Rob.
Regards,
Rob.
strFolder = "C:\Temp\Temp"
intCount = CountFiles(strFolder)
MsgBox strFolder & " has " & intCount & " files in it."
Function CountFiles(strFolderPath)
Set objShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Const intForReading = 1
strTempFile = Replace(WScript.ScriptFullName, WScript.ScriptName, "") & "TempCount.txt"
strCommand = "cmd /c dir /a-d /s /b " & objFSO.GetFolder(strFolderPath).ShortPath & " > """ & strTempFile & """"
objShell.Run strCommand, 0, True
Set objFile = objFSO.OpenTextFile(strTempFile, intForReading, False)
intCount = 0
While Not objFile.AtEndOfStream
objFile.SkipLine
intCount = intCount + 1
Wend
objFile.Close
objFSO.DeleteFile strTempFile, True
CountFiles = intCount
End Function
ASKER
Thakns for everyone's responses. The DIR I need to monitor is an UNC path. \\servername\folder.
I tried your scripts but I think it is having a hard time functioning becuase of the UNC path inste of a local path. Can you confirm?
I tried your scripts but I think it is having a hard time functioning becuase of the UNC path inste of a local path. Can you confirm?
Powershell doesn't care whether the path is local or UNC... it acts the same.
ASKER
RobSampson,
Your script worked well with UNC, but it displayed the results. I would like to have those results either dropped into an email or a file in which I can Blat out to email.
What is my next step?
Your script worked well with UNC, but it displayed the results. I would like to have those results either dropped into an email or a file in which I can Blat out to email.
What is my next step?
ASKER
BSonPosh,
I am testing your results...
I am testing your results...
Hi, this will use blat.exe to send an email with the count of files in the folder.
You can modify these as required:
strBlatPath = "C:\Blat.exe"
strBody = strFolder & " has " & intCount & " files in it."
strServer = "YourSMTPServer"
strTo = "recipient@domain.com"
strFrom = "sender@domain.com"
strSubject = "This is the subject"
Regards,
Rob.
You can modify these as required:
strBlatPath = "C:\Blat.exe"
strBody = strFolder & " has " & intCount & " files in it."
strServer = "YourSMTPServer"
strTo = "recipient@domain.com"
strFrom = "sender@domain.com"
strSubject = "This is the subject"
Regards,
Rob.
strFolder = "C:\Temp\Temp"
intCount = CountFiles(strFolder)
Set objShell = CreateObject("WScript.Shell")
strBlatPath = "C:\Blat.exe"
strBody = strFolder & " has " & intCount & " files in it."
strServer = "YourSMTPServer"
strTo = "recipient@domain.com"
strFrom = "sender@domain.com"
strSubject = "This is the subject"
strCommand = strBlatPath & " """ & strBody & """ -server " & strServer & " -to " & strTo & " -f " & strFrom & " -s """ & strSubject & """"
objShell.Run strCommand, 1, True
MsgBox "Blat has been run."
Function CountFiles(strFolderPath)
Set objShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Const intForReading = 1
strTempFile = Replace(WScript.ScriptFullName, WScript.ScriptName, "") & "TempCount.txt"
strCommand = "cmd /c dir /a-d /s /b " & objFSO.GetFolder(strFolderPath).ShortPath & " > """ & strTempFile & """"
objShell.Run strCommand, 0, True
Set objFile = objFSO.OpenTextFile(strTempFile, intForReading, False)
intCount = 0
While Not objFile.AtEndOfStream
objFile.SkipLine
intCount = intCount + 1
Wend
objFile.Close
objFSO.DeleteFile strTempFile, True
CountFiles = intCount
End Function
ASKER
Thanks RobSampson,
I think I am unable to get your Blat script to work. I get a pop up indicating it ran, but I received no email. Flip side of that, If I test the BLAT but the following line, it works.
C:\Jobs\Blat.exe -to glenn@spr.com, -s "Orphaned Files" -f admin@spr.com -server mail.spr.com
Any thoughts?
I think I am unable to get your Blat script to work. I get a pop up indicating it ran, but I received no email. Flip side of that, If I test the BLAT but the following line, it works.
C:\Jobs\Blat.exe -to glenn@spr.com, -s "Orphaned Files" -f admin@spr.com -server mail.spr.com
Any thoughts?
OK, using the parameters you specified above, try this. You should see the result of the BLAT command now.
Regards,
Rob.
Regards,
Rob.
strFolder = "C:\Temp\Temp"
intCount = CountFiles(strFolder)
Set objShell = CreateObject("WScript.Shell")
strBlatPath = "C:\Jobs\Blat.exe"
strBody = strFolder & " has " & intCount & " files in it."
strServer = "mail.spr.com"
strTo = "glenn@spr.com"
strFrom = "admin@spr.com"
strSubject = "Orphaned Files"
strCommand = "cmd /k " & strBlatPath & " """ & strBody & """ -server " & strServer & " -to " & strTo & " -f " & strFrom & " -s """ & strSubject & """"
objShell.Run strCommand, 1, True
MsgBox "Blat has been run."
Function CountFiles(strFolderPath)
Set objShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Const intForReading = 1
strTempFile = Replace(WScript.ScriptFullName, WScript.ScriptName, "") & "TempCount.txt"
strCommand = "cmd /c dir /a-d /s /b " & objFSO.GetFolder(strFolderPath).ShortPath & " > """ & strTempFile & """"
objShell.Run strCommand, 0, True
Set objFile = objFSO.OpenTextFile(strTempFile, intForReading, False)
intCount = 0
While Not objFile.AtEndOfStream
objFile.SkipLine
intCount = intCount + 1
Wend
objFile.Close
objFSO.DeleteFile strTempFile, True
CountFiles = intCount
End Function
ASKER
I think we are close - when I launch it, I get the following error:
Blat v2.6.2 w/GSS encryption (build : Feb 25 2007 12:06:19)
unknown error code 2 when trying to open \\gwmerrel\temp\ has 2 files in it.
C:\Documents and Settings\gwmerrel\Desktop>
Blat v2.6.2 w/GSS encryption (build : Feb 25 2007 12:06:19)
unknown error code 2 when trying to open \\gwmerrel\temp\ has 2 files in it.
C:\Documents and Settings\gwmerrel\Desktop>
Hmmm, it looks like the body has to be read from a text a text file. Try this. It will write the body text to a text file, and try to use that during the send.
Regards,
Rob.
Regards,
Rob.
strFolder = "C:\Temp\Temp"
intCount = CountFiles(strFolder)
Set objShell = CreateObject("WScript.Shell")
strBlatPath = "C:\Jobs\Blat.exe"
strBody = strFolder & " has " & intCount & " files in it."
strServer = "mail.spr.com"
strTo = "glenn@spr.com"
strFrom = "admin@spr.com"
strSubject = "Orphaned Files"
Set objFSO = CreateObject("Scripting.FileSystemObject")
strBodyFile = Replace(WScript.ScriptFullName, WScript.ScriptName, "") & "BodyText.txt"
Set objBody = objFSO.CreateTextFile(strBodyFile, True)
objBody.Write strBody
objBody.Close
Set objBody = Nothing
strCommand = "cmd /k " & strBlatPath & " """ & strBodyFile & """ -server " & strServer & " -to " & strTo & " -f " & strFrom & " -s """ & strSubject & """"
objShell.Run strCommand, 1, True
objFSO.DeleteFile strBodyFile, True
MsgBox "Blat has been run."
Function CountFiles(strFolderPath)
Set objShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Const intForReading = 1
strTempFile = Replace(WScript.ScriptFullName, WScript.ScriptName, "") & "TempCount.txt"
strCommand = "cmd /c dir /a-d /s /b " & objFSO.GetFolder(strFolderPath).ShortPath & " > """ & strTempFile & """"
objShell.Run strCommand, 0, True
Set objFile = objFSO.OpenTextFile(strTempFile, intForReading, False)
intCount = 0
While Not objFile.AtEndOfStream
objFile.SkipLine
intCount = intCount + 1
Wend
objFile.Close
objFSO.DeleteFile strTempFile, True
CountFiles = intCount
End Function
ASKER
Awesome Rob.
I tried to make changes to it but was not successful, but how do I add more (strFolder) DIRs to be scanned?
I tried to make changes to it but was not successful, but how do I add more (strFolder) DIRs to be scanned?
Hi, what about this? The array at the top can have your folders in it. The body text is appended to with each folder.
Regards,
Rob.
Regards,
Rob.
arrFolders = Array( _
"C:\Temp\Temp", _
"C:\Temp\Temp", _
"C:\Temp\Temp" _
)
Set objShell = CreateObject("WScript.Shell")
strBlatPath = "C:\Jobs\Blat.exe"
strServer = "mail.spr.com"
strTo = "glenn@spr.com"
strFrom = "admin@spr.com"
strSubject = "Orphaned Files"
strBody = "Please see below the folder details:"
For Each strFolder In arrFolders
intCount = CountFiles(strFolder)
strBody = strBody & VbCrLf & strFolder & " has " & intCount & " files in it."
Next
Set objFSO = CreateObject("Scripting.FileSystemObject")
strBodyFile = Replace(WScript.ScriptFullName, WScript.ScriptName, "") & "BodyText.txt"
Set objBody = objFSO.CreateTextFile(strBodyFile, True)
objBody.Write strBody
objBody.Close
Set objBody = Nothing
strCommand = "cmd /k " & strBlatPath & " """ & strBodyFile & """ -server " & strServer & " -to " & strTo & " -f " & strFrom & " -s """ & strSubject & """"
objShell.Run strCommand, 1, True
objFSO.DeleteFile strBodyFile, True
MsgBox "Blat has been run."
Function CountFiles(strFolderPath)
Set objShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Const intForReading = 1
strTempFile = Replace(WScript.ScriptFullName, WScript.ScriptName, "") & "TempCount.txt"
strCommand = "cmd /c dir /a-d /s /b " & objFSO.GetFolder(strFolderPath).ShortPath & " > """ & strTempFile & """"
objShell.Run strCommand, 0, True
Set objFile = objFSO.OpenTextFile(strTempFile, intForReading, False)
intCount = 0
While Not objFile.AtEndOfStream
objFile.SkipLine
intCount = intCount + 1
Wend
objFile.Close
objFSO.DeleteFile strTempFile, True
CountFiles = intCount
End Function
ASKER
Hey Rob,
It works great but it will not close. I have to endtask on the blat process.
Wow, new problem!
It works great but it will not close. I have to endtask on the blat process.
Wow, new problem!
Does blat actually finish, and return to the command prompt? If not, I have no idea how we can resolve that....I'm not sure what's wrong with blat in that case...do you have the latest version?
If Blat *does* finish, and it's just the command prompt that stays open, change this bit:
strCommand = "cmd /k " & strBlatPath & " """ & strBodyFile & """ -server " & strServer & " -to " & strTo & " -f " & strFrom & " -s """ & strSubject & """"
objShell.Run strCommand, 1, True
to this
strCommand = "cmd /c " & strBlatPath & " """ & strBodyFile & """ -server " & strServer & " -to " & strTo & " -f " & strFrom & " -s """ & strSubject & """"
objShell.Run strCommand, 0, True
Then just check to make sure in Task Manager that Blat.exe is not still running.
Regards,
Rob.
If Blat *does* finish, and it's just the command prompt that stays open, change this bit:
strCommand = "cmd /k " & strBlatPath & " """ & strBodyFile & """ -server " & strServer & " -to " & strTo & " -f " & strFrom & " -s """ & strSubject & """"
objShell.Run strCommand, 1, True
to this
strCommand = "cmd /c " & strBlatPath & " """ & strBodyFile & """ -server " & strServer & " -to " & strTo & " -f " & strFrom & " -s """ & strSubject & """"
objShell.Run strCommand, 0, True
Then just check to make sure in Task Manager that Blat.exe is not still running.
Regards,
Rob.
ASKER
OK - I figured out what is hanging the process. After the script runs, a little VB dialouge pops up and says: BLAT HAS BEEN RUN.
This is what is preventing this script from ending.
DO you have any other "Awesome" suggestions?
This is what is preventing this script from ending.
DO you have any other "Awesome" suggestions?
ASKER
GOT IT!
The line: MsgBox "Blat has been run."
was the cluprit that hung the process as it was wiating for me to HIT ok.
Thanks - I think I am good to go here. :)
The line: MsgBox "Blat has been run."
was the cluprit that hung the process as it was wiating for me to HIT ok.
Thanks - I think I am good to go here. :)
Oh yeah, sure, just change this line
MsgBox "Blat has been run."
to this
'MsgBox "Blat has been run."
and that line won't run, and the script will finish silently.
Regards,
Rob.
MsgBox "Blat has been run."
to this
'MsgBox "Blat has been run."
and that line won't run, and the script will finish silently.
Regards,
Rob.
ASKER
Rob,
I am about to close this and accept the solution. Before I do, allow me to ask one more question:
Can I take the same script and add more folders, and also with those folders have it search for specific files types? For example:
arrFolders = Array( _
"C:\Temp1\Temp\*.tiff", _
"C:\Temp2\Temp\*.tmp", _
"C:\Temp3\Temp\*.tmp", _
"C:\Temp4\Temp" _
)
I am about to close this and accept the solution. Before I do, allow me to ask one more question:
Can I take the same script and add more folders, and also with those folders have it search for specific files types? For example:
arrFolders = Array( _
"C:\Temp1\Temp\*.tiff", _
"C:\Temp2\Temp\*.tmp", _
"C:\Temp3\Temp\*.tmp", _
"C:\Temp4\Temp" _
)
Yes to adding more folder, but not yet for searching for specific file types....that would need a small change....I'll do it now...
Regards,
Rob.
Regards,
Rob.
OK, here you go.
Regards,
Rob.
Regards,
Rob.
arrFolders = Array( _
"C:\Temp\Temp;*.vbs", _
"C:\Temp\Temp\;*.vbs", _
"C:\Temp\Temp\", _
"C:\Temp\Temp" _
)
Set objShell = CreateObject("WScript.Shell")
strBlatPath = "C:\Jobs\Blat.exe"
strServer = "mail.spr.com"
strTo = "glenn@spr.com"
strFrom = "admin@spr.com"
strSubject = "Orphaned Files"
strBody = "Please see below the folder details:"
For Each strFolder In arrFolders
intCount = -1
strFolderSpec = ""
strFileSpec = ""
If InStr(strFolder, ";") > 0 Then
strFolderSpec = Split(strFolder, ";")(0)
strFileSpec = Split(strFolder, ";")(1)
Else
strFolderSpec = strFolder
strFileSpec = Null
End If
intCount = CountFiles(strFolderSpec, strFileSpec)
If strFileSpec <> "" Then
strBody = strBody & VbCrLf & strFolderSpec & " has " & intCount & " " & strFileSpec & " files in it."
Else
strBody = strBody & VbCrLf & strFolderSpec & " has " & intCount & " files in it."
End If
Next
Set objFSO = CreateObject("Scripting.FileSystemObject")
strBodyFile = Replace(WScript.ScriptFullName, WScript.ScriptName, "") & "BodyText.txt"
Set objBody = objFSO.CreateTextFile(strBodyFile, True)
objBody.Write strBody
objBody.Close
Set objBody = Nothing
strCommand = "cmd /k " & strBlatPath & " """ & strBodyFile & """ -server " & strServer & " -to " & strTo & " -f " & strFrom & " -s """ & strSubject & """"
'objShell.Run strCommand, 1, True
objFSO.DeleteFile strBodyFile, True
WScript.Echo strBody
MsgBox "Blat has been run."
Function CountFiles(ByVal strTheFolder, ByVal strFileType)
Set objShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Const intForReading = 1
strTempFile = Replace(WScript.ScriptFullName, WScript.ScriptName, "") & "TempCount.txt"
If IsNull(strFileType) = False Then
strCommand = "cmd /c dir /a-d /s /b " & objFSO.GetFolder(strTheFolder).ShortPath & "\" & strFileType & " > """ & strTempFile & """"
Else
strCommand = "cmd /c dir /a-d /s /b " & objFSO.GetFolder(strTheFolder).ShortPath & " > """ & strTempFile & """"
End If
objShell.Run strCommand, 0, True
Set objFile = objFSO.OpenTextFile(strTempFile, intForReading, False)
intCount = 0
While Not objFile.AtEndOfStream
objFile.SkipLine
intCount = intCount + 1
Wend
objFile.Close
objFSO.DeleteFile strTempFile, True
CountFiles = intCount
End Function
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
I wish I could accept all as a solutions, but I'll just pick the last one!
Thanks for your diligence and patience.
Fortitude is your new middle name!
Thanks for your diligence and patience.
Fortitude is your new middle name!
ASKER
HIghest Level of Excellence from Rob.
Thanks for the grade.
Regards,
Rob.
Regards,
Rob.
ASKER
Rob - There is a new question posted if you are interested. :)
ID: 24204032
ID: 24204032
Do you need to know whether new files have been added, or are you just looking for a entire directory listing on a periodic basis?
From a command prompt, this will give you an entire directory listing, including subfolders:
dir /s /b "\\server\folder\*.*"
The /b is a "basic" output command, which will output the file paths only.
Regards,
Rob.