-1

I am trying to achieve this command in a batch file loop

md Documents
md Spreadsheets
md Medias
md Applications
md Archives
md Scripts
md Database
md Projects
md Tutorials

Cleaning Up documents

move *.pdf  Documents
move *.doc* Documents
move *.ppt* Documents
move *.txt Documents
move *.draw* Documents
move *.msg* Documents

Cleaning Up Spreadsheets

move *.csv Spreadsheets
move *.xls* Spreadsheets
move *.xml* Spreadsheets

Cleaning Up Medias

move *.psd Medias
move *.png Medias
move *.jp* Medias
move *.gif Medias
move *.tiff Medias
move *.mp* Medias
move *.avi Medias

Cleaning Up Applications

move *.exe Applications
move *.msi Applications
move *.iso Applications
move *.vsix Applications

Cleaning Up Archives

move *.zip Archives
move *.rar Archives
move *.7z Archives
move *.tar Archives

Cleaning Up Scripts

move *.cs Scripts
move *.js Scripts
move *.css Scripts

Cleaning Up Database files

move *.sql Database
move *.bak Database
move *.accdb Database

Trying to achieve same this as above using FOR loop and get extensions from inner loop from SET variables like Documents Spreadsheets etc.

Varirables

SETLOCAL
SET Folders=Documents Spreadsheets Medias Applications Archives Scripts Database
SET Documents=*.pdf *.doc* *.ppt* *.txt *.draw* *.msg*
SET Spreadsheets=*.csv *.xls *.xml
SET Medias=*.psd *.png *.jp* *.gif *.tif *.mp* *.avi *.mov
SET Applications=*.exe *.msi *.vsix *.iso 
SET Archives=*.zip *.rar *.7z *.tar 
SET Scripts=*.cs *.js *.css
SET Database=*.sql *.bak *.accdb

Loop

FOR %%f IN (%Folders%) DO 
(
    ECHO %%f
    FOR %%e IN (%%%%f%%) DO (
        ECHO    %%e %%f 
    )
)

TIMEOUT /t 10
CLS

The output from the loop goes like this

Documents
    %Documents% Documents 
Spreadsheets
    %Spreadsheets% Spreadsheets
Medias
    %Medias% Medias
Applications
    %Applications% Applications
Archives
    %Archives% Archives 
Scripts
    %Scripts% Scripts
Database
    %Database% Database
Astatine
  • 45
  • 4

1 Answers1

3

You are quite close, but writing an explicit percent sign doesn't pay the bill. Use delayed expansion instead:

@echo off
setlocal enabledelayedexpansion

SET Folders=Documents Spreadsheets Medias Applications Archives Scripts Database
SET Documents=*.pdf *.doc* *.ppt* *.txt *.draw* *.msg*
SET Spreadsheets=*.csv *.xls *.xml
SET Medias=*.psd *.png *.jp* *.gif *.tif *.mp* *.avi *.mov
SET Applications=*.exe *.msi *.vsix *.iso 
SET Archives=*.zip *.rar *.7z *.tar 
SET Scripts=*.cs *.js *.css
SET Database=*.sql *.bak *.accdb

FOR %%f IN (%Folders%) DO (
    ECHO cleaning up %%f
    FOR %%e IN (!%%f!) DO (
        ECHO  move "%%e" "%%f\" 
    )
)
Stephan
  • 53,940
  • 10
  • 58
  • 91
  • Thanks a bunch was scratching my head for a long long time :D – Astatine Feb 17 '21 at 18:25
  • yeah, batch variables are a bit ... well. ... unintuitive when you go beyond the most basic usage `:D`. – Stephan Feb 17 '21 at 18:35
  • (!%%f!) Could you please explain this portion – Astatine Feb 17 '21 at 18:54
  • please read the answer, I linked to. If you want to dive really deep into that rabbit hole, I recommend [this thread](https://stackoverflow.com/questions/4094699/how-does-the-windows-command-interpreter-cmd-exe-parse-scripts). But be warned - it's heavy stuff... – Stephan Feb 17 '21 at 18:58