setlocal EnableExtensions DisableDelayedExpansion if not defined V set V=0 if not defined args ( goto :return_arg ) set INPUT=%args% set OUTBUF= set UNQ= set QTD= set INPUT=%INPUT:#=#35% set INPUT=%INPUT:@=#64% set "PENDING=%INPUT:"=@sep%" &:: escape double quotes and split consecutive marks ::#### split into unquoted part, quoted part, remains :loop for /F "tokens=1,2* delims=@" %%I in (" %PENDING%") do ( set "UNQ=%%I" set "QTD=%%J" set "PENDING=%%K" ) set "UNQ=%UNQ:~1%" if %V%==1 ( echo unquoted: (echo UNQ :"%UNQ%")&(echo QTD :"%QTD%")&(echo REST:"%PENDING%")&(if defined OUTBUF echo OUTBUF:"%OUTBUF%") ) if defined QTD (set "QTD=%QTD:~3%") if defined PENDING (set "PENDING=%PENDING:~3%") if %V%==1 ( (echo QTD :"%QTD%")&(echo REST:"%PENDING%") ) if not defined UNQ if defined OUTBUF ( set concat_next=true goto :process_unquote ) set concat_prev= set concat_check= if defined UNQ (set "concat_check=%UNQ:~0,1%") if not "%concat_check%"==" " (set concat_prev=true) set concat_next= set concat_check= if defined UNQ (set "concat_check=%UNQ:~-1%") if not "%concat_check%"==" " (set concat_next=true) if not defined concat_prev if defined OUTBUF ( goto :return_arg ) ::#### process unquoted part :process_unquote if defined UNQ if "%UNQ: =%"=="" (set UNQ=) if not defined UNQ goto :process_quoted for /F "tokens=1* eol=" %%I in ("%UNQ%") do ( set "token=%%I" set "UNQ=%%J" ) if %V%==1 ( (echo unq :"%token%")&(echo UNQ :"%UNQ%") ) set "OUTBUF=%OUTBUF%%token%" if defined UNQ ( goto :return_arg ) else ( if not defined concat_next ( goto :return_arg ) ) ::#### process quoted part :process_quoted if %V%==1 ( echo quoted: (echo UNQ :"%UNQ%")&(echo QTD :"%QTD%")&(echo REST:"%PENDING%")&(if defined OUTBUF echo OUTBUF:"%OUTBUF%") ) set "OUTBUF=%OUTBUF%%QTD%" set QTD= if not defined PENDING ( goto :return_arg ) goto :loop ::#### return splitted argv :return_arg set "argv=%OUTBUF%" if defined argv (set "argv=%argv:#64=@%") if defined argv (set "argv=%argv:#35=#%") if defined QTD (set QTD="%QTD%") :: special handling is required because they may contain double quotes if defined PENDING set PENDING=%PENDING:@sep="% set args=%UNQ%%QTD%%PENDING% if defined args set args=%args:#64=@% if defined args set args=%args:#35=#% endlocal & set "argv=%argv%" & set args=%args% exit /b