@echo off setlocal enabledelayedexpansion set arr=ABCD set /a n=4 :: echo !arr! call :permu %n% arr goto:eof :permu num &arr setlocal if %1 equ 1 call echo(!%2! & exit /b set /a "num=%1-1,n2=num-1" set arr=!%2! for /L %%c in (0,1,!n2!) do ( call:permu !num! arr set /a n1="num&1" if !n1! equ 0 (call:swapit !num! 0 arr) else (call:swapit !num! %%c arr) ) call:permu !num! arr endlocal & set %2=%arr% exit /b :swapit from to &arr setlocal set arr=!%3! set temp1=!arr:~%~1,1! set temp2=!arr:~%~2,1! set arr=!arr:%temp1%=@! set arr=!arr:%temp2%=%temp1%! set arr=!arr:@=%temp2%! :: echo %1 %2 !%~3! !arr! endlocal & set %3=%arr% exit /b