gkeiller
gkeiller

Reputation: 13

CMD Batch script to sort files

I have an application which saves files to a FTP folder that I sync to my PC which contains multiple JPG and MP4 files, named in the following format:

ARC20170510151547.jpg
ARC20170510151549.mp4

What I'm trying to do is:

  1. Copy the files from my FTP to my PC
  2. Sort the files into folders based on the day they were created
  3. Delete files from the FTP older than 14 days
  4. Delete files from the PC older than 1 month

Using WinSCP to connect to FTP with the following code, I am able to download all the files to my local drive:

"c:\program files (x86)\winscp\winscp.com" /ini=nul /command ^
    "open ftp://[username]:[password]@[ipaddress]/" ^
    "synchronize local f:\[localpath]\ /[remotepath]/ " ^
"exit"

Then I need to sort the files. Here is where I am stuck. I'm think I know the commands but I am unsure how to use the 'tokens' and 'delims' to get it to work how I want.

@echo
for %%a in (*.*) do (
   echo processing "%%a"
      for /f "tokens=1 delims=" %%a in ("%%~nxa") do (
         md "%%b-%%c" 2>nul
         move "%%a" "%%b-%%c" >nul
      )
)
pause

As I know the filename format isn't going to change, one thing I have considered is adding some special characters to the filename, maybe using the 'ren' command. I could then use those special characters as search delims but, again, I'm struggling how to best proceed.

Removing local files older than 30 days is easy using the following script

forfiles -p "f:\[localpath]" -s -m *.* -d <number of days> -c "cmd /c del @path"

However, the WinSCP 'RM' command I am using doesn't appear to be working. It returns an error "no file matching '*<14D' found"

"rm /[filepath]/*<14D" ^

Any help, advice and guidance would be very gratefully received!

Upvotes: 1

Views: 1371

Answers (2)

user6811411
user6811411

Reputation:

Since there is no delimiter between the date elements you need substrings,
substrings do only work with normal variables and in a (code block) you need delayed expansion

It's unclear if you want folders with year-month or month-day, select the proper part in the batch and comment/uncomment the Rem:
With extensions enabled md can create the structure YY-MM\DDin one step.
So you can move directly to that folder.

@Echo off&SetLocal EnableExtensions EnableDelayedExpansion
for %%a in (ARC*.*) do (
   echo processing "%%a"
   Set File=%%~nA
   Set YY=!File:~3,4!
   Set MM=!File:~7,2!
   Set DD=!File:~9,2!
   Rem YY-MM\DD
   md "!YY!-!MM!\!DD!" 2>nul
   move "%%a" "!YY!-!MM!\!DD!" >nul
)
pause

Upvotes: 1

gkeiller
gkeiller

Reputation: 13

@LotPings! Thank you for the script. This does almost what I want it to do. I have modified the script as below which moves the files into folders based on the Day.

So, each day, maybe 100 - 200 files are generated. So I do not mind having a folder for each day. Once the files are moved into their respective "Day" folder, what I'd then like to do is create a SubFolder "!YY!-!MM!" and then move the "!DD!" Folders into the "!YY!-!MM!" folder.

@Echo off&SetLocal EnableExtensions EnableDelayedExpansion
    for %%a in (ARC*.*) do (
    echo processing "%%a"
    Set File=%%~a
    Set YY=!File:~3,4!
    Set MM=!File:~7,2!
    Set DD=!File:~9,2!
    md "!DD!" 2>nul
    md "!YY!-!MM!" 2>nul
    move "%%a" "!DD!" >nul
 )
 pause

Upvotes: 0

Related Questions