PassionateCoder
PassionateCoder

Reputation: 23

two condtions in one loop (Batch file)

I have built 2 batch files, which each have his own function first one:

Changes the file name to today's date

SET src_folder="C:\DIR_A\"
SET tar_folder="C:\DIR_A\DIR_B"


for /f %%a IN ('dir "%src_folder%" /b') do REN *.xml %time:~0,2%%time:~3,2%%time:~6,2%_%date:~-10,2%%date:~-7,2%%date:~-4,4%.xml 

pause

Second one:

Move files from DIR_A to DIR_B

SET src_folder="C:\DIR_A\"
SET tar_folder="C:\DIR_A\DIR_B"

for /f %%a IN ('dir "%src_folder%*.xml" /b') do move %src_folder%\%%a %tar_folder%

pause

My question is: how can I combine them both in one loop?

Second question is with the naming loop. The loop only names the first XML file, and says that the name already exist. That's true therefor is there anyway to make it pause before it name again, so the files have different names?

Upvotes: 0

Views: 81

Answers (2)

user7818749
user7818749

Reputation:

Simplest is to do it in one go, without rename, just move them with a new name:

@echo off
for %%a IN (*.xml) do (
    move "%source_folder%\%%a" "%tar_folder%\%time:~0,2%%time:~3,2%%time:~6,2%_%date:~-10,2%%date:~-7,2%%date:~-4,4%.xml"
)
pause

Other methods:

@echo off
setlocal enabledelayedexpansion
for /f %%a IN ('dir /b /a-d "%src_folder%\*.xml"') do (
    set "myren=%time:~0,2%%time:~3,2%%time:~6,2%_%date:~-10,2%%date:~-7,2%%date:~-4,4%.xml"
    ren "%%a" "!myren!"
    move "%src_folder%\!myren!" "%tar_folder%"
)
pause

Or without delayedexpansion:

@echo off
for /f %%a IN ('dir /b /a-d "%src_folder%\*.xml"') do (
    move "%%a" "%tar_folder%"
    ren "%tar_folder%\%%a" "%time:~0,2%%time:~3,2%%time:~6,2%_%date:~-10,2%%date:~-7,2%%date:~-4,4%.xml"
)
pause

or even:

@echo off
for /f %%a IN ('dir /b /a-d "%src_folder%\*.xml"') do (
    ren "%source_folder%\%%a" "%time:~0,2%%time:~3,2%%time:~6,2%_%date:~-10,2%%date:~-7,2%%date:~-4,4%.xml"
)
move /Y "%src_folder%\*.xml" "%tar_folder%"
pause

Simplest, do it in one go:

Upvotes: 1

Stephan
Stephan

Reputation: 56180

Simple: to use several commands, use a code block:

for %%a IN ("%src_folder%") do (
   echo RENAME %%a
   echo COPY %%a
)

Note: keep in mind, you may need to use delayed expansion (not in this example though)

Applied to your code:

@echo off
setlocal enabledelayedexpansion

SET src_folder="C:\DIR_A\"
SET tar_folder="C:\DIR_A\DIR_B"

for %%a IN ("%src_folder%*.xml") do (
  REN "%%a" !time:~0,2!!time:~3,2!!time:~6,2!_%date:~-10,2%%date:~-7,2%%date:~-4,4%.xml 
  move "%src_folder%\%%a" "%tar_folder%"
  timeout 1 >nul
)

Note: here you need delayed expansion (at least) with the time variable. Consider to delay date too (would be "best practice")

Alternatively: first rename all files, then copy them in one go:

@echo off
setlocal enabledelayedexpansion

SET src_folder="C:\DIR_A\"
SET tar_folder="C:\DIR_A\DIR_B"

for %%a IN ("%src_folder%*.xml") do (
  REN "%%a" !time:~0,2!!time:~3,2!!time:~6,2!_%date:~-10,2%%date:~-7,2%%date:~-4,4%.xml
  timeout 1 >nul
)
move "%src_folder%\*.xml" "%tar_folder%\"

Upvotes: 1

Related Questions