cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Daniel_B
Lansweeper Alumni
This script allows to perform a network file search on a specific hard-drives (optionally limited to a certain folder including subfolders). The result will be written into a text file. If the hard-disk of target computers isn't too big, it should take less than 10 minutes to get all results.

PLEASE NOTE: This script uses a standard DOS file search command. However, it might strongly influence the performance of target computers. This depends on the parameters you are using and other circumstances which we have no influence on.

Following parameters can be given to the script in step 3:
/drive: (i.e. /drive:d ) - drive to search on (default will be c)
/type: (i.e. /type:exe ) - file type to search for (without this parameter, it lists all files)
/path: (i.e. /path:"\Program Files (x86)\" ) - folder to search in (incl. subfolders)
/target: (i.e. /target:"C:\LS\filesearch_output.txt" ) - output file target
/bare: (i.e. /bare:true ) - output file in bare list format without details

Create a new file on your package share under folder Scripts, name it "filesearch_dos.vbs" and fill it in an editor with the following code:

Option Explicit
Const ForWriting = 2
Const ForAppending = 8
Dim objFSO 'File System Object
Set objFSO = CreateObject("Scripting.FileSystemObject")
Dim objTS 'Text Stream Object
Dim objWS 'WScript object
Dim Drive 'Parameter: drive to search in
Dim Filetype 'Parameter: file type to search for
Dim objFile 'file found
Dim query 'WMI query string
Dim searchstring 'files to search for
Dim path 'Parameter: path of files to be searched
Dim target 'Parameter: file location of output file
Dim targetfolder 'Folder of the output file
Dim arg 'script arguments
Dim drivesinfo 'search info string drives
Dim typesinfo 'search info string filetypes
Dim info 'search info text
Dim i 'counter
Dim starttime 'start time for duration

'Read script arguments
if wscript.arguments.Named.count > 0 then
if WScript.Arguments.Named("drive") <> "" Then
Drive = WScript.Arguments.Named("drive")
End If

if WScript.Arguments.Named("type") <> "" Then
Filetype = WScript.Arguments.Named("type")
End If

if WScript.Arguments.Named("path") <> "" Then
path = WScript.Arguments.Named("path")
If Left(path,1) <> "\" Then path = "\" & path
End If

if WScript.Arguments.Named("target") <> "" Then
target = WScript.Arguments.Named("target")
End If

End if

'Build search query
If Len(Drive) > 0 Then
searchstring = Drive & ":"
Else
searchstring = "c:"
End if
If Len(path) > 0 Then
searchstring = searchstring & path
if Right(searchstring,1) <> "\" then searchstring = searchstring & "\"
Else
searchstring = searchstring & "\"
End if
If Len(Filetype) > 0 Then
searchstring = searchstring & "*." & Filetype
Else
searchstring = searchstring & "*.*"
End if

'Define scan result target location and open file
If Not Len(target)>0 Then target = "C:\temp\LSfilesearch.txt"
targetfolder = Mid(target,1,InStrRev(target,"\"))
If Not objFSO.FolderExists(targetfolder) Then objFSO.CreateFolder(targetfolder)
Set objTS = objFSO.OpenTextFile(target, ForWriting, True)

'write file search parameters into result file
starttime = Now()
info = "Starting file search on drive "
If Len(drive)>0 Then info = info & drive & ":" else info = info & "c:"
If Len(Filetype)>0 Then info = info & " for file type " & Filetype
If Len(path)>0 then info = info & " under path """ & path & """"
objTS.WriteLine(info & vbCrLf & "---")
objTS.Close()

'Execute search
query = """%comspec%"" /e:4096 /s /c dir /s "
if LCase(WScript.Arguments.Named("bare")) = "true" Then query = query & "/b"
query = query & "/o """ & searchstring & """ >> " & target
Set objWS = CreateObject("Wscript.Shell")
objWS.Run query, 0, True

Set objTS = objFSO.OpenTextFile(target, ForAppending, False)
objTS.WriteLine("---" & vbCrLf & "Search completed in " & _
Datediff("s",starttime,now()) & " seconds")
objTS.Close()
WScript.Quit 0
11 REPLIES 11
pryzhkov
Engaged Sweeper
Hi, Daniel!
While using this script i was facing such issue: generated report contains unreadable characters, like next:
Starting file search on drive d: for file type pst
---
Volume in drive D is New Volume
Volume Serial Number is ***********

Directory of d:\

16.03.2016 18:28 4я082 test.pst
1 File(s) 4я082 bytes

Directory of d:\$RECYCLE.BIN\S-1-5-21-2849041822-3509271814-4006248400-4254

17.03.2016 15:32 544 $IFQZIJV.pst
17.03.2016 15:08 0 $RFQZIJV.pst
2 File(s) 544 bytes

Directory of d:\pst_search

16.03.2016 18:28 4я082 test.pst
1 File(s) 4я082 bytes

Total Files Listed:
4 File(s) 8я708 bytes
0 Dir(s) 107я247я927я296 bytes free
---
Search completed in 0 seconds


what's the problem, and how can i fix it?
Thank you for your script!
IrenaK
Engaged Sweeper
Thank you , but works correctly if - /exclude: "Windows\.*"
Daniel_B
Lansweeper Alumni
Filtering out specific folders during the search is not possible. The only thing you can do is filtering out parts of the search result. The script attached to this post allows an additional parameter which lets you define text you don't want to see in your result. You can change the command in step 3 of the package to something like

/type:"exe" /target:"c:\LS\filesearch_result.txt" /exclude:"Windows\"

Note: You need to change the file type of the attached file from txt to vbs, or just copy the code to your existing script.
IrenaK
Engaged Sweeper
Hi ,Daniel,

could you edit this script with possibility to exclude some directory.

Thanks
mickeyshowers
Engaged Sweeper III
It works! Thanks!
Daniel_B
Lansweeper Alumni
@mickeyshowers: Thanks for testing it. There were two mistakes. I corrected my last post. With this modification it is working as expected.

Keep in mind that if you are using a network share (anything other than {PackageShare}) as target, you need to deploy the package under a user account which has write access to that share.
mickeyshowers
Engaged Sweeper III
The additions to the script produce an error on this line for me.

set objShellEnvironment = objShell.Environment("Process")

Variable is undefined: 'objShellEnvironment'
Daniel_B
Lansweeper Alumni
For this you need to modify the script. At the top, add the following lines:
Dim objShell
Dim objShellEnvironment
Dim computername 'name of the computer the script is executed on
set objShell = WScript.CreateObject("WScript.Shell")
set objShellEnvironment = objShell.Environment("Process")
computerName = objShellEnvironment("ComputerName")


Then after these lines in the existing script
'Define scan result target location and open file
If Not Len(target)>0 Then target = "C:\temp\LSfilesearch.txt"

add the following line:

target = Left(target, Len(target)-4) & "_" & computername & ".txt"
MiniWalks
Engaged Sweeper
Looks like this could be a winner 🙂

Is there any way to use the computer name as a variable in the output file name?

ie
Target:\\NAS\Share\%PC_NAME%.SearchResult.txt ?

Cheers,