tabush
asked on
Script to Search for and move specific files
Hello All,
I am looking for a script to search a file server for specific files and then move them to an external drive. I have an excel spreadsheet of all the file names I am looking for but they are spread out over several directories on several servers.
I am ok with running the script individually on each server but I need a script that will take the file names in my spreadsheet and search the server for them. Once they are found they need to be moved to a specified location.
I need to do this for approximately 15,000 files - all of which I have the names of.
Any help would be greatly appreciated.
Thanks,
I am looking for a script to search a file server for specific files and then move them to an external drive. I have an excel spreadsheet of all the file names I am looking for but they are spread out over several directories on several servers.
I am ok with running the script individually on each server but I need a script that will take the file names in my spreadsheet and search the server for them. Once they are found they need to be moved to a specified location.
I need to do this for approximately 15,000 files - all of which I have the names of.
Any help would be greatly appreciated.
Thanks,
Would you be okay with first exporting the list of files from excel to a text file, and then letting the script read the text file?
~bp
~bp
Here's a first pass at a solution for you. It reads the list of files from a text file, loads them into a dictionary for fast searching, and then processes all files in the tree rooted at the folder you specify. Adjust the paths at the top to suit your needs.
Currently the script will just echo to the console the files it would copy so you can see if it works right. If so, comment out the wscript.echo and uncomment the f.copy line below it.
~bp
Currently the script will just echo to the console the files it would copy so you can see if it works right. If so, comment out the wscript.echo and uncomment the f.copy line below it.
~bp
' Define constants
Const ForReading = 1
' Define literals
strList = "C:\Temp\EE26609636.txt"
strSource = "C:\Temp"
strDest = "C:\Temp\EE26609636\"
' Set up objects needed
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set dicFiles = CreateObject("Scripting.Dictionary")
dicFiles.CompareMode = vbTextCompare
' Load dictionary entries from text file of file names
Set objList = objFSO.OpenTextFile(strList, ForReading)
Do Until objList.AtEndOfStream
strLine = objList.Readline
If Not dicFiles.Exists(strLine) Then
dicFiles.Add strLine, ""
End If
Loop
objList.Close
set objList = Nothing
' Start recursive tree scan looking for files to copy
ScanFolder(objFSO.GetFolder(strSource))
Function ScanFolder(objFolder)
' Look at all files in this folder, copy if in dictionary of files to copy
For Each f In objFolder.Files
If dicFiles.Exists(f.Name) Then
Wscript.Echo f.Path
'f.Copy strDest
End If
Next
' Recursively process each subfolder in this folder
For Each sf in objFolder.SubFolders
ScanFolder(sf)
Next
End Function
' Wrap up
set dicFiles = Nothing
set objFSO = Nothing
uh - did you want this done in powershell, or vbScript? (above example is vbScript)
Export your spreadsheet to a CSV with all the files to search in one column with the heading "filename"
Run this script on each server ... it will take a while
Export your spreadsheet to a CSV with all the files to search in one column with the heading "filename"
Run this script on each server ... it will take a while
#CSV file
$CSVfile = "c:\file_names.csv"
#Path to copy all discovered files to
$destinationPath = "c:\newfolder"
#import list of short filenames ("spreadsheet.xls" ... NOT "c:\files\spreadsheet.xls")
$filesToSearch = Import-CSV $CSVfile
#create single-dimensional array
$filesToSearch = $filesToSearch | % { $_.filename }
#iterate through all files on the server
(gci c:\ -recurse | ? { $_.psIsContainer -eq 0 }) | % {
If ($filesToSearch -contains $_.name) {
move-item $_.FullName -destination $destinationPath;
}
}
ahh - I see ... was posted in powershell forum as well - my mistake.
ASKER
bp,
Thanks for the script. I tested it and while it works if I specify a specific directory, when I specify the source as "C:\" (as this would be the source on the server that I would like to recursively search) I get an error:
Line: 30
Char: 4
Error: Permission Denied
Code: 800A0046
Now, I understand that error may be occuring as there may be files that are read-only. Is there a way to get around this so the script doesnt break if it hits a read only file?
Thanks
Thanks for the script. I tested it and while it works if I specify a specific directory, when I specify the source as "C:\" (as this would be the source on the server that I would like to recursively search) I get an error:
Line: 30
Char: 4
Error: Permission Denied
Code: 800A0046
Now, I understand that error may be occuring as there may be files that are read-only. Is there a way to get around this so the script doesnt break if it hits a read only file?
Thanks
There are a host of file copy utilities out there as well. Rich Copy might be worth a look.
RichCopy.pdf
RichCopy.pdf
Rich Copy is sort of a GUI based, souped up version of Robocopy.
==> Code: 800A0046
Seems like we should be able to trap that with "on error" or something and work around it, I'll see what I can do...
~bp
Seems like we should be able to trap that with "on error" or something and work around it, I'll see what I can do...
~bp
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Great Work! The script runs as it should. I made a few changes but it looks good.
Thanks
Thanks
~bp