We help IT Professionals succeed at work.
Get Started

Robocopy - copying empty folders even when it is told not to

2,182 Views
Last Modified: 2016-08-15
Summary of question:
Is Robocopy working as expected, or should I be using different command line parameters to prevent empty folder creation?

Detail Issue:
Below is the RoboCopy Job File, which is saved using the /SAVE parameter.

Note the /S parameter is used and not the /E parameter.

When the command is run, via a VBScript which assembles the command line, it works without issue EXCEPT it is creating empty folders.  From what I can tell from the documentation and every site I have looked at on the Internet for this issue, RoboCopy should NOT be creating these empty folders..

From what I understand, if a folder does not contain one of the desired file types, it should be considered empty.
If I have 1,200 folders nested 30 levels deep and those folders contain files of type .FUBAR, it should NOT create empty destination folders of the same name, yet it is.

::
::

::
:: Source Directory :
::
	/SD:\\ComputerName\c$\	:: Source Directory.

::
:: Destination Directory :
::
	/DD:E:\Migrated Data\ccnllp\Username\ComputerName\Root\ByExtension\	:: Destination Directory.

::
:: Include These Files :
::
	/IF		:: Include Files matching these names
		*.log
		*.txt
		*.acl
		*.ade
		*.asd
		*.cnv
		*.doc
		*.dot
		*.grv
		*.h1q
		*.iaf
		*.maf
		*.mam
		*.maq
		*.mar
		*.mat
		*.maw
		*.mda
		*.mdb
		*.mde
		*.mdt
		*.mdw
		*.mpd
		*.mpp
		*.mpt
		*.mso
		*.oab
		*.obi
		*.oft
		*.olm
		*.one
		*.ops
		*.ost
		*.pip
		*.pot
		*.ppa
		*.pps
		*.ppt
		*.prf
		*.pst
		*.pub
		*.puz
		*.slk
		*.snp
		*.svd
		*.vdx
		*.vsd
		*.vss
		*.vst
		*.vsx
		*.vtx
		*.wbk
		*.wll
		*.xar
		*.xla
		*.xlb
		*.xlc
		*.xll
		*.xlm
		*.xls
		*.xlt
		*.xlw
		*.xsf
		*.xsn
		*.dic
		*.lex
		*.nk2
		*.pdf
		*.rtf
		*.thmx
		*.ccda
		*.ccdb
		*.ccdb
		*.ccdc
		*.ccde
		*.ccdp
		*.ccdr
		*.ccdt
		*.ccdu
		*.crtx
		*.docm
		*.docx
		*.dotm
		*.dotx
		*.epkg
		*.pa
		*.pmsg
		*.potm
		*.potx
		*.ppam
		*.ppsm
		*.ppsx
		*.pptm
		*.pptx
		*.sldm
		*.sldx
		*.vsdx
		*.xl
		*.xlam
		*.xlsb
		*.xlsm
		*.xlsx
		*.xltm
		*.xltx
		*.xslb
		*.db
		*.dbf
		*.ldb
		*.mdb
		*.sdf
		*.sqlite
		*.bmp
		*.emf
		*.gif
		*.ico
		*.jpg
		*.png
		*.tif
		*.wmf
		*.dat
		*.kml
		*.kmz
		*.xml
		*.wav
		*.wmdb
		*.wpl
		*.cfg
		*.config
		*.icc
		*.ini
		*.properties
		*.zip
		*.msg
	/XJD		:: eXclude Junction points for Directories.

::
:: Exclude These Directories :
::
	/XD		:: eXclude Directories matching these names
		temp
		akamai
		cache
		unified_cache_leveldb_leveldb2
		\\ComputerName\c$\Users\Username\WiredRed
		\\ComputerName\c$\Users\Username\Videos
		\\ComputerName\c$\Users\Username\Music
		\\ComputerName\c$\Users\Username\Contacts
		\\ComputerName\c$\Users\Username\Pictures
		\\ComputerName\c$\Users\Username\Downloads
		\\ComputerName\c$\Users\Username\Documents
		\\ComputerName\c$\Users\Username\Desktop
		\\ComputerName\c$\Users\Username\Appdata\Roaming\Zeon
		\\ComputerName\c$\Users\Username\Appdata\Roaming\Litera
		\\ComputerName\c$\Users\Username\Appdata\Local\Litera
		\\ComputerName\c$\Users\Username\Appdata\Local\Interwoven\QuickSearch\Config
		\\ComputerName\C$\dbmakerW64
		\\ComputerName\C$\epop
		\\ComputerName\C$\epopAdmin
		\\ComputerName\C$\epopremove
		\\ComputerName\C$\epopremove-verified
		\\ComputerName\C$\ePopServer
		\\ComputerName\C$\inetpub
		\\ComputerName\C$\KB3AIK_EN
		\\ComputerName\C$\Robocopy
		\\ComputerName\C$\robocopy.bak
		\\ComputerName\C$\Scripts
		\\ComputerName\C$\StaffData
		\\ComputerName\C$\treesize
		\\ComputerName\C$\Visio
		\\ComputerName\C$\WiredRed
		content.ie*

::
:: Exclude These Files :
::
	/XF		:: eXclude Files matching these names
		*.tmp
		*cache*
		*akamai*
		*.lock
::
:: Copy options :
::
	/S		:: copy Subdirectories, but not empty ones.
	/PF		:: check run hours on a Per File (not per pass) basis.
	/COPY:DAT	:: what to COPY for files (default is /COPY:DAT).
	/ZB		:: use restartable mode; if access denied use Backup mode.
	/EFSRAW		:: copy all encrypted files in EFS RAW mode.
::
:: Retry Options :
::
	/R:1		:: number of Retries on failed copies: default 1 million.
	/W:10		:: Wait time between retries: default is 30 seconds.
::
:: Logging Options :
::
	/V		:: produce Verbose output, showing skipped files.
	/X		:: report all eXtra files, not just those selected.
	/TS		:: include source file Time Stamps in the output.
	/FP		:: include Full Pathname of files in the output.
	/NP		:: No Progress - don't display percentage copied.
	/LOG+:C:\Robocopy\Username_ComputerName_YYYYMMDD_HHMMSS.log	:: output status to LOG file (append to existing log).

Open in new window


If Robocopy is, in fact, performing as expected, I presume I am going to need to run something like the following to recursively remove empty folders.  This is a step I would rather not take, though would write as a secondary housekeeping script due to time constraints on the primary script.

'Sub to recursively delete all empty folders. 
Sub RecursiveDeleteEmptyFolders(ByVal strDirectory)
	On Error Resume Next
	Dim objFolder, objSubFolder
	Set objFolder = objFSO.GetFolder(strDirectory)
 
	WScript.Echo "Checking Folder: " & strDirectory & ". Contains " & objFolder.Files.Count & " files and " & objFolder.SubFolders.Count & " folders."

	'If the RemoveDesktopIni or RemoveThumbsDB Flag is set to True then remove any files called Desktop.ini or thumbs.db
	If objFSO.FileExists(strDirectory & "\desktop.ini") Then 
		objFSO.DeleteFile(strDirectory & "\desktop.ini")
		If Err Then
			WScript.Echo "Error deleting:" & strDirectory & "\desktop.ini" & " - " & Err.Description
			intErrorCount = intErrorCount + 1
			Err.Clear
		End If
   	End If
	If objFSO.FileExists(strDirectory & "\thumbs.db") Then 
		objFSO.DeleteFile(strDirectory & "\thumbs.db")
			If Err Then 
				WScript.Echo "Error deleting:" & strDirectory & "\thumbs.db" & " - " & Err.Description
				intErrorCount = intErrorCount + 1
				Err.Clear
		End If
   	End If
	
	'Check if there are any subfolders, and if so go through each of those recursively deleting them
    If objFolder.SubFolders.Count > 0 Then
    	For Each objSubFolder in objFolder.SubFolders
			RecursiveDeleteEmptyFolders objSubFolder.Path
		Next
    End If

    'Now check if the folder contains any files.
    If objFolder.Files.Count = 0 And objFolder.SubFolders.Count = 0 Then
		
		'Check that the folder name does not begin with a tildeand if it does not then delete it
		If Left(objFolder.Name,1) <> "~" Then
			WScript.Echo "Deleting: " & objFolder.Path
			objFolder.Delete
			If Err Then
				WScript.Echo "Error deleting:" & objFolder.Name & " – " & Err.Description
				intErrorCount = intErrorCount + 1
				Err.Clear
			End If
		End If
    End If 
	
End Sub

Open in new window

Comment
Watch Question
Enterprise Business Process Architect
CERTIFIED EXPERT
Commented:
This problem has been solved!
Unlock 3 Answers and 17 Comments.
See Answers
Why Experts Exchange?

Experts Exchange always has the answer, or at the least points me in the correct direction! It is like having another employee that is extremely experienced.

Jim Murphy
Programmer at Smart IT Solutions

When asked, what has been your best career decision?

Deciding to stick with EE.

Mohamed Asif
Technical Department Head

Being involved with EE helped me to grow personally and professionally.

Carl Webster
CTP, Sr Infrastructure Consultant
Ask ANY Question

Connect with Certified Experts to gain insight and support on specific technology challenges including:

  • Troubleshooting
  • Research
  • Professional Opinions
Did You Know?

We've partnered with two important charities to provide clean water and computer science education to those who need it most. READ MORE