xxcopy batch file to move specific client folders using an input text file.

I am in the testing phase right now, so I am using local test source folders.  The F:\xxcopy\NAS\FROM\ folder has (A,B,C,D,E - Z) subfolders, and within each letter folder there are specific client folders that will be listed in an input file:  ClientFolders.txt.

Sample ClientFolders.txt
F:\xxcopy\NAS\FROM\I\INYONG*
F:\xxcopy\NAS\FROM\1-9\724REA*

The problem with the client folders is the name is composed of the client ID (i.e. INYONG, 724REA) which should be the first six characters of the folder name.  After the folder name sixth character there is additional client descriptive text.  So that is why I appended the "*" afterwards.  The first six characters of the folder (Client ID) will always be unique.

I simply want the batch file to use the input text file that has the first six characters of folder names that need to be located and moved.  

So I created the following batch file using xxcopy:

text-copy.bat

for /f "delims=" %%i in (ClientFolders.txt) do echo D|xxcopy "F:\xxcopy\NAS\FROM\%%i" "F:\xxcopy\NAS\TO\%%i" /SC /F /S /E /VL /YY /V /JV /RC /TTA0 /TCA /H /TCC /TCW /I /FW /oA:"F:\xxcopy\29MAR2016 TEST Folder\Logs\Test1.log" /oF3

The above log file reveals the following errors: Exit code 34 (illegal command parameter.  Invalid destination directory name.

===============================================================================
XXCOPY   Pro Edition   ver 3.21.1   2016-03-29 18:44:40   Windows Ver 5.2.3790 Service Pack 2
 Command Line  = xxcopy "F:\xxcopy\NAS\FROM\F:\xxcopy\NAS\FROM\I\INYONG*" "F:\xxcopy\NAS\TO\F:\xxcopy\NAS\FROM\I\INYONG*" /SC /F /LTREE /VL /YY /V /JV /RC /TTA0 /TCA /H /TCC /TCW /I /FW /oA:"F:\xxcopy\29MAR2016 TEST Folder\Logs\Test1.log" /oF3
Invalid destination directory name

 Directories Processed = 0
 Total Data in Bytes   = 0
 Elapsed time in sec.  = 0.000
 Action speed (MB/min) = 0.0
 Files Selected        = 0
 Log File Appended     = "F:\xxcopy\29MAR2016 TEST Folder\Logs\Test1.log"
 Exit code             = 34 (Illegal command parameter)


===============================================================================
XXCOPY   Pro Edition   ver 3.21.1   2016-03-29 18:44:40   Windows Ver 5.2.3790 Service Pack 2
 Command Line  = xxcopy "F:\xxcopy\NAS\FROM\F:\xxcopy\NAS\FROM\1-9\724REA*" "F:\xxcopy\NAS\TO\F:\xxcopy\NAS\FROM\1-9\724REA*" /SC /F /LTREE /VL /YY /V /JV /RC /TTA0 /TCA /H /TCC /TCW /I /FW /oA:"F:\xxcopy\29MAR2016 TEST Folder\Logs\Test1.log" /oF3
Invalid destination directory name

 Directories Processed = 0
 Total Data in Bytes   = 0
 Elapsed time in sec.  = 0.000
 Action speed (MB/min) = 0.0
 Files Selected        = 0
 Log File Appended     = "F:\xxcopy\29MAR2016 TEST Folder\Logs\Test1.log"
 Exit code             = 34 (Illegal command parameter)
cmp119IT ManagerAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

aranaCommented:
xxcopy doesnt allow wildcards in the destination specifier, but you could just leave it without the %%i  in the destination part and i think it would work just fine, try it with a small set first
NVITEnd-user supportCommented:
Assuming ClientFolders.txt looks like:
1234567890
1234567890
1234567890

Open in new window


Make a test.bat to see what this example does:
@echo off
setlocal enabledelayedexpansion

set FNClients=c:\ClientFolders.txt

for /f %%a in (%FNClients%) do (
  set FNNew=%%a
  ECHO !FNNew:~0,6!
)

Open in new window


When you're satisfied with that, make a similar adjustment for yours:
setlocal enabledelayedexpansion

set FNClients=c:\ClientFolders.txt
for /f %%a in (%FNClients%) do (
  set Client=%%a
  set Client=!Client:~0,6!
  echo D|xxcopy "F:\xxcopy\NAS\FROM\%Client%" "F:\xxcopy\NAS\TO\%Client%" /SC /F /S /E /VL /YY /V /JV /RC /TTA0 /TCA /H /TCC /TCW /I /FW /oA:"F:\xxcopy\29MAR2016 TEST Folder\Logs\Test1.log" /oF3
)

Open in new window

cmp119IT ManagerAuthor Commented:
NVIT - that did "not" work.  It moved "all" the files regardless of folder name.  That's not what is needed.  I need to move the client subfolders based on the first six characters of folder name.

The main path = F:\xxcopy\NAS\FROM

Within the \FROM folder there are subfolders such as A,B,C,D,E all the way through Z, also a folder named "1-9".  This was done because there are so many clients to hold in one folder they had to be separated.  

Subfolder layout example:

F:\xxcopy\NAS\FROM\1-9
F:\xxcopy\NAS\FROM\A
F:\xxcopy\NAS\FROM\B
F:\xxcopy\NAS\FROM\C
F:\xxcopy\NAS\FROM\D
...
F:\xxcopy\NAS\FROM\Z

So for testing purposes I wanted to move only two client folders that are located in subfolders I and 1-9 as displayed below.  No other clients folder should be touched other than the partial folder names in the input text file.

F:\xxcopy\NAS\FROM\I\INYONG Inyong corp
F:\xxcopy\NAS\FROM\1-9\724REA 724 Rocky Roads Inc

the ClientFolders.txt simply listed two items:

INYONG
724REA

The first six characters of each client subfolder starts with the Client ID which is unique to each folder. So it should only locate and move two client folders "INYONG Inyong corp" and "724REA 724 Rocky Roads Inc".  

Maybe the ClientsFolders.txt file needs to have the whole path along with the client folder name, such as.  Remember, the clients folders are located in different folders A-Z, 1-9.

F:\xxcopy\NAS\FROM\I\INYONG
F:\xxcopy\NAS\FROM\1-9\724REA
Bootstrap 4: Exploring New Features

Learn how to use and navigate the new features included in Bootstrap 4, the most popular HTML, CSS, and JavaScript framework for developing responsive, mobile-first websites.

NVITEnd-user supportCommented:
Try this version 2.
Note: This version just ECHOs the command. To run it for real, remove the ECHO prefix on line 17:
@echo off
setlocal enabledelayedexpansion

set FNLog=F:\xxcopy\29MAR2016 TEST Folder\Logs\Test1.log

set SrcDir=F:\xxcopy\NAS\FROM
set TgtDir=F:\xxcopy\NAS\TO
set FNClients=c:\ClientFolders.txt

for /d %%D in ("%SrcDir%\*") do (
  set ClientFullDir=%%D
  set ClientDir=%%~nD
  
  for /f %%a in (%FNClients%) do (
    if exist "!ClientFullDir!\%%a*" (
      for /d %%E in ("!ClientFullDir!\%%a*") do (
        echo xxcopy "!ClientFullDir!\%%~nE" "%TgtDir%\!ClientDir!\%%~nE" /SC /F /S /E /VL /YY /V /JV /RC /TTA0 /TCA /H /TCC /TCW /I /FW /oA:"%FNLog%" /oF3
        echo.
      )
    )
  )
)

Open in new window

cmp119IT ManagerAuthor Commented:
Well I tried running it, and nothing happens.  DOS window opens and then closes, log log file either.  Could be set clientdir=%%~nD, and the xxcopy refers to %%~nE?
cmp119IT ManagerAuthor Commented:
OOPs typos:  Well I tried running it, and nothing happens.  DOS window opens and then closes, no log file either.  Could it be "set clientdir=%%~nD", and the xxcopy command portion refers to "%%~nE"?
NVITEnd-user supportCommented:
To clarify, for debugging reasons, all this version does is ECHO the results to the screen. If the results look like they will work for you, remove the ECHO to run it for real, as mentioned in last post.

Do this:
1. Open a CMD window
2. Either drag and drop the .bat file into the CMD window, or type out the full path and file name.
3. ENTER

The xxcopy commands will show for your visual verification.
cmp119IT ManagerAuthor Commented:
I completed the above steps of removing the @echo off, and dragged it to a command prompt, and it should everything fine, but does not do anything.  No log file is generated either.
cmp119IT ManagerAuthor Commented:
I reviewed your instructions once again, and removed "echo" on line 17 and tried running it, and it did not do anything either.  All I am doing is launching the batch file in windows.  It should run without issue.
NVITEnd-user supportCommented:
It is not supposed to copy anything. Also, no log file should be made.

It should just show xxcopy lines in the CMD window. You are supposed to verify whether the folder names are correct.

Run it again in cmd window. Copy and paste (do not type) exact results.
cmp119IT ManagerAuthor Commented:
Okay, I was able to run it.  I modified the (%FNClients%) portion with double quotes ("%FNClients%")thinking that was the problem.  I removed the double quotes and it ran.  Will now start more extensive testing.  Sorry for the mix up.
cmp119IT ManagerAuthor Commented:
So I tried running it as suggested, and it echoed everything, but did not run.  I reviewed the logic and made small modifications by placing double quotes (%FNClients%), I also changed the path for the log file, FROM and TO location paths with no spaces, and also the path for the input file.  I then also removed "echo" from line 17 which was located just before the xxcopy command.  I also modified the input file using two different partial client folder names.  It ran it, and it moved the two client folders and its also reflected in the log file.  Below shows the adjustments made.


@echo off
setlocal enabledelayedexpansion

set FNLog=F:\xxcopy\29MAR2016TESTFolder\Logs\Test1.log

set SrcDir=F:\xxcopy\29MAR2016TESTFolder\NAS\FROM
set TgtDir=F:\xxcopy\29MAR2016TESTFolder\NAS\TO
set FNClients=F:\xxcopy\29MAR2016TESTFolder\ClientFolders.txt

for /d %%D in ("%SrcDir%\*") do (
  set ClientFullDir=%%D
  set ClientDir=%%~nD
 
  for /f %%a in (%FNClients%) do (
    if exist "!ClientFullDir!\%%a*" (
      for /d %%E in ("!ClientFullDir!\%%a*") do (
        xxcopy "!ClientFullDir!\%%~nE" "%TgtDir%\!ClientDir!\%%~nE" /SC /F /S /E /VL /YY /V /JV /RC /TTA0 /TCA /H /TCC /TCW /I /FW /oA:"%FNLog%" /oF3
        echo.
      )
    )
  )
)
NVITEnd-user supportCommented:
>  It ran it, and it moved the two client folders and its also reflected in the log file.
I assume you're good to go.
cmp119IT ManagerAuthor Commented:
Originally there were spaces in the folder "29MAR2016 TEST Folder", so I placed double quotes before and after the whole path "F:\xxcopy\29MAR2016 TEST Folder\Logs\Test1.log", but it still did not run.  So I renamed this folder removing the spaces as "29MAR2016TESTFolder".  Once I am able to test everything using local test folders, I will need to run it so that that source and destination are located on a local NAS device.  I am hoping I can use UNCs for the source: \\NAS\ClientFolders\, and destination: \\NAS\MovedClientFolders\.
cmp119IT ManagerAuthor Commented:
Let me ask you several questions:

Referring to the below commands, if the path has spaces then should the whole path be enclosed in double quotes?

set FNLog=F:\xxcopy\29MAR2016TESTFolder\Logs\Test1.log
set SrcDir=F:\xxcopy\29MAR2016TESTFolder\NAS\FROM
set TgtDir=F:\xxcopy\29MAR2016TESTFolder\NAS\TO
set FNClients=F:\xxcopy\29MAR2016TESTFolder\ClientFolders.txt

I am trying to understand the logic in how you were able to get it use the input text file which only has the first six characters in the folder name and match it with client folder names that exist in specific subfolders?   What I am getting at is explanation of the command steps (logic) taken to derive the result.
NVITEnd-user supportCommented:
Normally, wrap with quotes at the endpoint, where everything is put together, e.g. at the xxcopy line.

Basically...
The first for /d scans each subfolder...
Each 6 digit client name for /f is applied to above subfolder
Each matching subfolder\client is xxcopy'd

Hope that helps.

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
cmp119IT ManagerAuthor Commented:
NVIT is amazing!  His script works great!!!  Thanks a bunch!!!
NVITEnd-user supportCommented:
You're welcome, cmp119! I'm glad to help.
cmp119IT ManagerAuthor Commented:
I just tried running this script on live data and now there are many problems.  Are you available to assist?
NVITEnd-user supportCommented:
What errors, symptoms?
cmp119IT ManagerAuthor Commented:
I opened up another question titled "xxcopy batch file going wrong".  It's too much to write again, and it explains all the details of the problems encountered.  Basically when it encounters a top level client folder name with a period ".", that needs to be moved, it does not move it, and simply creates the folder structure for all the folders along side it at the destination with no files copied.  That's all wrong.  I also removes all empty folders from any client subfolder that is copied the subfolder structure.  You may want to review the other question mentioned above to get a better idea.
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Microsoft DOS

From novice to tech pro — start learning today.