Batch For loop array - loops

Okay so here is what I have.
#echo off
setLocal EnableDelayedExpansion
:begin
set /a M=0
set /a number=0
set /p Input=You:
echo %Input% >> UIS
for /F "tokens=1 delims= " %%i in ("%Input%") do (
set /a M+=1
set i!M!=%%i
)
del UIS 1>nul 2>nul
:loop
set /a number+=1
set invar=!i%number%!
echo %invar%
pause > nul
goto loop
Say, for example, the Input string was "Lol this is my input string"
I want the for loop to set i!M! where M = 1 to "Lol", where M = 2 i!M! is "this" and where M = 3 i!M! is "is" and so on. Now, of course, this can't go on forever, so even if I have to stop when M = 25 or something, and say the string was only 23 words long. Then when M = 24 and 25 then i!M! is simply null or undefined.
Any help is appreciated, thank you.

for /f reads line by line, not word by word.
Here's an answer proposed at How to split a string in a Windows batch file? and modified for your situation:
#echo off
setlocal ENABLEDELAYEDEXPANSION
REM Set a string with an arbitrary number of substrings separated by semi colons
set teststring=Lol this is my input string
set M=0
REM Do something with each substring
:stringLOOP
REM Stop when the string is empty
if "!teststring!" EQU "" goto displayloop
for /f "delims= " %%a in ("!teststring!") do set substring=%%a
set /a M+=1
set i!M!=!substring!
REM Now strip off the leading substring
:striploop
set stripchar=!teststring:~0,1!
set teststring=!teststring:~1!
if "!teststring!" EQU "" goto stringloop
if "!stripchar!" NEQ " " goto striploop
goto stringloop
:displayloop
set /a number+=1
set invar=!i%number%!
echo %invar%
pause > nul
goto displayloop
endlocal

for /F command divide a line in a definite number of tokens that must be processed at once via different replaceable parameters (%%i, %%j, etc). Plain for command divide a line in an undefined number of words (separated by space, comma, semicolon or equal-sign) that are processed one by one in an iterative loop. This way, you just need to change this for:
for /F "tokens=1 delims= " %%i in ("%Input%") do (
by this one:
for %%i in (%Input%) do (
PS - I suggest you to write the array in the standard form, enclosing the subscript in square brackets; it is clearer this way:
set i[!M!]=%%i
or
set invar=!i[%number%]!

Related

how to count each letter in a sentence withoud the blank spaces in batch

I am trying to count all the letters that are in a sentence and I am trying to echo it on screen, but I couldn't get it to work I have tried to set a count so it goes up by 1 for each letter but couldn't get it to work. This is my code:
#echo off
:loop
SET Input=
set /p Input=jouwscript
IF "%Input%"=="" (
echo Write atleast 1 word
goto loop
) else (
FOR %%a IN (%Input%) DO (
ECHO %%a
)
)
If you are willing to accept a temporary file, it gets very simple:
Just write the string without spaces to a file and get the file size:
#Echo off
setlocal
set /p "input=Enter sentence: "
<nul >temp set /p "=%input: =%"
for %%a in (temp) do echo "%input%" has %%~za letters.
This counts all characters but spaces (also TABs, numbers, punctuation marks, and even poison chars (like <>&|%"!))
If you are on a supported Windows system and are able to use the programs already on it, you could easily do this using a single PowerShell command. This command will replace whitespace (space and tab), then calculate the length of the resulting string.
SET "Input=now is the time"
FOR /F %%A IN ('powershell -NoLogo -NoProfile -Command ^
"('%Input%' -replace '\s+','').Length"') DO (SET /A "COUNT=%%A")
ECHO COUNT is %COUNT%
Here is a method that counts characters and words input. Word length maximum of 30 characters assumed. The basis is substring modification with regards to counting letters - iterating over a given number of character spaces and incrementing the letter count for each non empty letter space.
Substring modification is also used to handle the presence of ! within strings. If you need to count letters only, ignoring characters, you will need to adjust the below to remove non letter characters from the string prior to commencing the nested loop that performs the counts. Alternately, Use findstr to reject any input that contains non letter/ whitespace characters.
#Echo off
Call :Getinput Sentence
Echo(Your Sentence: "%Sentence%"
Echo(Contains: %WC% Words and %LC% Letters
Goto :Eof
:GetInput
:# Disable DE Environment to allow substitution of ! Expansion character
Setlocal DISABLEDELAYEDEXPANSION
:# Nul Letter and Word Count Variables
Set /A "LC=WC=0"
:# Nul existing variable value
Set "input="
:# Additional safegaurd; Doublequote input command.
Set /P "input=Enter Sentence: "
:# Flag input as not entered if true; exit function
If Not Defined Input Exit /B 1
:# Substitute exclamations for counting during DelayedExpansion Environment
Set "input=%input:!=[EXC]%"
:# Allow safe use of input strings, And expansion of current value of variables when modified in code blocks:
Setlocal EnableDelayedExpansion
:# Assign Word Value; Modify ! Expansion Char for counting; Count each Character in Word
For %%W in (!Input!)Do (
Set "Word=%%W"
Set "Word=!Word:[EXC]=#!"
Set /A WC+=1
For /L %%L in (0 1 30)Do If Not "!Word:~%%L,1!" == "" (
Set /A LC+=1
)
)
:# Exit DelayedExpansion Environments
For %%i in (1 2)Do Endlocal & (
Set "LC=%LC%"
Set "WC=%WC%"
Set "Input=%Input%"
)
:# Substitute exclamation marks back into the input string after exiting DE environment
:# Assign value to Arg 1
Set "%~1=%Input:[EXC]=!%"
:# Flag input as entered
Exit /B 0
output:
C:\Users\tcdou>tout
Enter Sentence: test! one
Your Sentence: "test! one"
Contains: 2 Words and 8 Letters
C:\Users\tcdou>tout
Enter Sentence: test! ! two
Your Sentence: "test! ! two"
Contains: 3 Words and 9 Letters
C:\Users\tcdou>
As you have not stipulated exactly what you're looking to do, or exactly how you'd like your output, here's something a little bit different to the other current answers:
#Echo Off & SetLocal EnableExtensions DisableDelayedExpansion
Set "input=" & Set /P "input=jouwscript>" & If Not Defined input GoTo :EOF
For /F Delims^=^ EOL^= %%G In ('(%%SystemRoot%%\System32\cmd.exe /V /U /S /D /C
"Set /P "^=!input: ^=!" 0<NUL"^) ^| %%SystemRoot%%\System32\find.exe /N /V ""'
) Do Set /P "=%%G" 0<NUL & Echo(
Pause
The last line is optional, I've included it only for testing by GUI, (doubleclick).
As an extension of the above idea, you could of course capture each character as a variable too:
#Echo Off & SetLocal EnableExtensions DisableDelayedExpansion
(For /F "Delims==" %%G In ('"(Set Char[) 2>NUL"') Do Set "%%G=") & Set "i=0"
Set "input=" & Set /P "input=jouwscript>" & If Not Defined input GoTo :EOF
For /F Delims^=^ EOL^= %%G In ('(%%SystemRoot%%\System32\cmd.exe /V /U /S /D /C
"Set /P "^=!input: ^=!" 0<NUL"^) ^| %%SystemRoot%%\System32\find.exe /V ""'
) Do (Set "Char[0]= %%G" & For /F "Tokens=2 Delims= " %%H In ('Set Char[0]'
) Do Set /A i+=1 & SetLocal EnableDelayedExpansion & For %%I In (!i!
) Do EndLocal & Set "Char[%%I]=%%H" & Set "Char[0]=")
Echo There were %i% non space characters.
If Defined Char[1] For /L %%G In (1,1,%i%) Do Set Char[%%G]
Pause
Once again, the last line is optional, I've included it only for testing by GUI, (doubleclick).

count an exact character in one line - cmd

I would like write a batch file to count the number of occurrences of a specific character in each line of a text file.
For example, the count of \ in the string "aa\bb\cc\dd\" would be 4.
The find and the findstr show only the number of lines which is contains the exact character.
You might try the following script, providing the input string as (quoted) command line argument:
set "STRING=%~1$"
set STRING="%STRING:\=" "%"
set /A "COUNT=-1"
for %%E in (%STRING%) do set /A "COUNT+=1"
echo Count of `\`: %COUNT%
This replaces every character to be counted by " + SPACE + " and encloses the entire string in between "", so the input string aa\bb\cc\dd\ becomes "aa" "bb" "cc" "dd" "". The resulting string is fed into a for loop that recognises individual items to iterate through -- five in this case. The counter variable COUNT is initialised with a value of -1, so the result is not the number of iterated items but the separators, namely the \ characters present in the original string.
This approach fails if the string contains ? or * characters. It would also fail in case the character to count is one of the following: ", %, =, *, ~.
#echo off
setlocal
set "string=aa\bb\cc\dd\"
set "count=-1"
for %%a in ("%string:\=" "%") do set /A count+=1
echo %count%
This method works correctly as long as the string don't include wild-card characters: *?; if this is required, I would use the same npocmaka's method, but written in a simpler way:
#echo off
setlocal EnableDelayedExpansion
set "string=aa\bb\cc\dd\"
set "str=A%string%Z"
set "count=-1"
for /F "delims=" %%a in (^"!str:\^=^"^
% Do NOT remove this line %
^"!^") do (
set /A count+=1
)
echo %count%
While slow, you can try with this
#echo off
setlocal enableextensions disabledelayedexpansion
set "inputFile=input.txt"
set "searchChar=\"
for /f "delims=" %%a in ('
findstr /n "^" "%inputFile%"
') do for /f "delims=:" %%b in ("%%~a") do (
set "line=%%a"
for /f %%c in ('
cmd /u /v /e /q /c"(echo(!line:*:=!)"^|find /c "%searchChar%"
') do echo Line %%b has %%c characters
)
The input file is readed using findstr /n to get all the lines in the file with a number prefix (both for output "decoration" and to ensure all the lines in the file are processed). Each line is processed inside a pipe, from cmd to find. The cmd instance is started with unicode output (/u) so when the readed line is echoed, the output will be a two bytes sequence for each input character, one of them a 0x0 ASCII character. The find command sees the 0 as a line terminator, so we get each character in the input line as one separated line. Now, the find command counts in how many lines the searched character happens.
#ECHO OFF
SETLOCAL
SET "String=a\b\c\\\\d"
CALL :count "%string%" \
ECHO %tally%
GOTO :EOF
:count
SETLOCAL enabledelayedexpansion
SET /a tally=0
SET "$2=%~1"
:cloop
SET "$1=%$2%"
SET "$2=!$1:*%2=!"
IF "%$1%" neq "%$2%" SET /a tally+=1&GOTO cloop
endlocal&SET tally=%tally%
GOTO :eof
Here's a way to count particular characters in a string. It won't work for the usual suspects.
here's one way:
#echo off
:checkCountOf string countOf [rtnrVar]
:: checks count of a substring in a string
setlocal EnableDelayedExpansion
set "string=aa"
set "string=%~1"
set "checkCountOf=%~2"
if "%~1" equ "" (
if "%~3" neq "" (
endlocal & (
echo 0
set "%~3=0"
exit /b 0
)
) else (
endlocal & (
echo 0
exit /b 0
)
)
)
if "!checkCountOf!" equ "$" (
set "string=#%string%#"
set "string=!string:%checkCountOf%%checkCountOf%=#%checkCountOf%#%checkCountOf%#!"
) else (
set "string=$%string%$"
set "string=!string:%checkCountOf%%checkCountOf%=$%checkCountOf%$%checkCountOf%$!"
)
set LF=^
rem ** Two empty lines are required
set /a counter=0
for %%L in ("!LF!") DO (
for /f "delims=" %%R in ("!checkCountOf!") do (
set "var=!string:%%~R%%~R=%%~L!"
set "var=!var:%%~R=%%~L!"
for /f "tokens=* delims=" %%# in ("!var!") do (
set /a counter=counter+1
)
)
)
if !counter! gtr 0 (
set /a counter=counter-1
)
if "%~3" neq "" (
endlocal & (
echo %counter%
set "%~3=%counter%"
)
) else (
endlocal & (
echo %counter%
)
)
you can call it like:
call ::checkCountOf "/aa/b/c/" "/" slashes
echo %slashes%
exit /b %errorlevel%
wont work with some special characters (",~ and !)
You can also use replacement and the :strlen function
Not tested extensively but works with your example.
#ECHO OFF
SETLOCAL disabledelayedexpansion
SET "String=\a\b\c\\\\d\\"
set "previous=%string%"
set /a count=0
:loop
set "newstg=%previous:*\=%"
IF NOT "%previous%"=="%newstg%" (
set /a count+=1
set "previous=%newstg%"
IF DEFINED previous goto loop
)
echo %count%
pause
GOTO :eof
Here is one more option. I don't think this is bullet proof with poison characters.
#ECHO OFF
SETLOCAL disabledelayedexpansion
SET "String=\\a\b\c\\\\d\\"
set i=0
set "x=%string%"
set "x=%x:\=" & set /A i+=1 & set "x=%"
echo %i%
pause

Substring length in text file using Batch

In input, I have a text file which contains numbers separated with a comma.
list.txt
111221,345,332133,66,5555, and so
I want to check the length of each string between the "," delimiter, in order to successively display the length of each word.
For example:
111221 is 6 characters long
345 is 3 characters long
332133 is 6 characters long
66 is 2 characters long
...
For this, I've written this code but it displays only the first word and the length is always "0". Without the for loop, it works fine for a single chain. Has anyone an idea to fix this?
Thank you.
#echo off
setlocal enabledelayedexpansion enableextensions
for /f "delims=," %%a in ('type list.txt') do (
set string=%%a
set temp_str=%string%
set str_len=0
:loop
if defined temp_str (
set temp_str=%temp_str:~1%
set /a str_len+=1
goto:loop )
echo !string! is !str_len! characters long
)
pause
endlocal
#echo off
setlocal enabledelayedexpansion enableextensions
for /f "delims=" %%f in ('type q35202446.txt') do (
for %%a in (%%f) do (
set "string=%%a"
set "temp_str=!string!"
set str_len=0
CALL :loop
echo !string! is !str_len! characters long
)
)
GOTO :eof
:loop
if defined temp_str (
set temp_str=%temp_str:~1%
set /a str_len+=1
GOTO loop )
GOTO :eof
I used a file named q35202446.txt containing your data for my testing.
Your problems are :
for /f ... reads a line at a time, so delims=, would provide you with just the first token in the line. Next iteration would read the next line (if it existed)
Putting the entire line ("delims=") into %%f allows you to use the default function of , (along with space, semicolon and tab) - a separator. The for ... %%a... sees a simple list of elements separated by commas.
You must use !string! to access the run-time value of string (with delayedexpansion invoked.) %string% will deliver the parse-time value of string which will be empty, hence reporting length 0.
Note the use of quotes in the string-assignment. That syntax ensures trailing spaces are not included in the string assigned.
A label terminates a "block" (parenthesised series of statements) so I've moved the length-calculator to a subroutine.
Your echo was correctly using !var! to access the run-time value of the variables.
You should use for /f to read line-by-line, then an inner for to tokenize each line on the commas. Something like this:
#echo off
setlocal
for /f "usebackq delims=" %%a in ("list.txt") do (
for %%t in (%%a) do (
call :length len %%t
setlocal enabledelayedexpansion
echo %%t is !len! characters long.
endlocal
)
)
goto :EOF
:length <return_var> <string>
setlocal enabledelayedexpansion
if "%~2"=="" (set ret=0) else set ret=1
set "tmpstr=%~2"
for %%I in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
if not "!tmpstr:~%%I,1!"=="" (
set /a ret += %%I
set "tmpstr=!tmpstr:~%%I!"
)
)
endlocal & set "%~1=%ret%"
goto :EOF
Credit: the :length function is based on jeb's answer here. It's much more efficient than a goto loop.

How to count characters in a text file using batch file

I want to count all the characters of a certain text. However in my code it only counts single string. But the requirement needs to count all characters including whites spaces and new line.. For example:
Hello World!
How are you today?
Hope you are okay
How am i going to do that in my code?Thanks.
My code:
#ECHO OFF
for %%i in (y.txt) do #set count=%%~zi
REM Set "string" variable
SET string=(Hello World
How are you today?
Im fine..) // i want to read these string because my code only read single string
REM Set the value of temporary variable to the value of "string" variable
SET temp_str=%string%
REM Initialize counter
SET str_len=0
:loop
if defined temp_str (
REM Remove the first character from the temporary string variable and increment
REM counter by 1. Countinue to loop until the value of temp_str is empty string.
SET temp_str=%temp_str:~1%
SET /A str_len += 1
GOTO loop
)
REM Echo the actual string value and its length.
ECHO %string% is %str_len% characters long!
this is all, you need:
#ECHO OFF
set /p "file=enter filename: "
for %%i in (%file%) do #set count=%%~zi
echo this file has %count% characters including whitespaces and special chars like line-feed/carriage-return etc.
With this function you can calculate the line number, the number of words and the number of characters in a text file
#ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "MOD=%1"
SET "ARC=%2"
IF %MOD%==/L GOTO :CONTLIN
IF %MOD%==/P GOTO :CONTPAL
IF %MOD%==/C GOTO :CONTCAR
:CONTLIN
FOR /f "TOKENS=*" %%z IN (%ARC%) DO SET /a LINEAS+=1
ECHO %LINEAS%
EXIT /b 0
:CONTPAL
FOR /f "TOKENS=*" %%x IN (%ARC%) DO FOR %%y IN (%%x) DO SET /a PALABRAS+=1
ECHO %PALABRAS%
EXIT /b 0
:CONTCAR
SETLOCAL
FOR /f "TOKENS=*" %%a IN (%ARC%) DO (FOR %%b IN (%%a) DO (FOR %%a IN (%%b) DO (SET
A=%%a)&(CALL :CC !A!)))
ECHO %CARACTERES%
EXIT /b 0
:CC
SET B=!A!
:I
SET /a CARACTERES+=1
SET B=%B:~1%
IF DEFINED B GOTO :I
EXIT /b 0
And I could access it from a file like this:
#ECHO OFF
SET ARCHIVO=TEXTO.TXT
FOR /F %%a IN ('CONTTEXT /L %ARCHIVO%') DO SET /a LINEAS=%%a
FOR /F %%a IN ('CONTTEXT /P %ARCHIVO%') DO SET /a PALABRAS=%%a
FOR /F %%a IN ('CONTTEXT /C %ARCHIVO%') DO SET /a CARACTERES=%%a
ECHO %LINEAS% LINEAS
ECHO %PALABRAS% PALABRAS
ECHO %CARACTERES% CARACTERES
PAUSE

Removing non alphanumeric characters in a batch variable

In batch, how would I remove all non alphanumeric (a-z,A-Z,0-9,_) characters from a variable?
I'm pretty sure I need to use findstr and a regex.
The solutionof MC ND works, but it's really slow (Needs ~1second for the small test sample).
This is caused by the echo "!_buf!"|findstr ... construct, as for each character the pipe creates two instances of cmd.exe and starts findstr.
But this can be solved also with pure batch.
Each character is tested if it is in the map variable
:test
set "_input=Th""i\s&& is not good _maybe_???"
set "_output="
set "map=abcdefghijklmnopqrstuvwxyz 1234567890"
:loop
if not defined _input goto endLoop
for /F "delims=*~ eol=*" %%C in ("!_input:~0,1!") do (
if "!map:%%C=!" NEQ "!map!" set "_output=!_output!%%C"
)
set "_input=!_input:~1!"
goto loop
:endLoop
echo(!_output!
And it could be speed up when the goto loop is removed.
Then you need to calculate the stringLength first and iterate then with a FOR/L loop over each character.
This solution is ~6 times faster than the above method and ~40 times faster than the solution of MC ND
set "_input=Th""i\s&& is not good _maybe_!~*???"
set "_output="
set "map=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890"
%$strLen% len _input
for /L %%n in (0 1 %len%) DO (
for /F "delims=*~ eol=*" %%C in ("!_input:~%%n,1!") do (
if "!map:%%C=!" NEQ "!map!" set "_output=!_output!%%C"
)
)
exit /b
The macro $strlen can be defined with
set LF=^
::Above 2 blank lines are required - do not remove
#set ^"\n=^^^%LF%%LF%^%LF%%LF%^^":::: StrLen pResult pString
set $strLen=for /L %%n in (1 1 2) do if %%n==2 (%\n%
for /F "tokens=1,2 delims=, " %%1 in ("!argv!") do (%\n%
set "str=A!%%~2!"%\n%
set "len=0"%\n%
for /l %%A in (12,-1,0) do (%\n%
set /a "len|=1<<%%A"%\n%
for %%B in (!len!) do if "!str:~%%B,1!"=="" set /a "len&=~1<<%%A"%\n%
)%\n%
for %%v in (!len!) do endlocal^&if "%%~b" neq "" (set "%%~1=%%v") else echo %%v%\n%
) %\n%
) ELSE setlocal enableDelayedExpansion ^& set argv=,
EDITED - #jeb is right. This works but is really, really slow.
#echo off
setlocal enableextensions enabledelayedexpansion
set "_input=Th""i\s&& is not good _maybe_???"
set "_output="
:loop
if not defined _input goto endLoop
set "_buf=!_input:~0,1!"
set "_input=!_input:~1!"
echo "!_buf!"|findstr /i /r /c:"[a-z 0-9_]" > nul && set "_output=!_output!!_buf!"
goto loop
:endLoop
echo !_output!
endlocal
So, back to the drawing board. How to make it faster? lets try to do as less operations as we can and use as much long substring as we can. So, do it in two steps
1.- Remove all bad characters that can generate problems. To do it we will use the hability of for command to identify these chars as delimiters , and then join the rest of the sections of god characters of string
2.- Remove the rest of the bad characters, locating them in string using the valids charactes as delimiters to find substrings of bad characters, replacing then in string
So, we end with (sintax adapted to what has been answered here)
#echo off
setlocal enableextensions enabledelayedexpansion
rem Test empty string
call :doClean "" output
echo "%output%"
rem Test mixed strings
call :doClean "~~asd123#()%%%^"^!^"~~~^"""":^!!!!=asd^>^<bm_1" output
echo %output%
call :doClean "Thi\s&& is ;;;;not ^^good _maybe_!~*???" output
echo %output%
rem Test clean string
call :doClean "This is already clean" output
echo %output%
rem Test all bad string
call :doClean "*******//////\\\\\\\()()()()" output
echo "%output%"
rem Test long string
set "zz=Thi\s&& is not ^^good _maybe_!~*??? "
set "zz=TEST: %zz%%zz%%zz%%zz%%zz%%zz%%zz%%zz%%zz%%zz%%zz%%zz%%zz%%zz%%zz%%zz%%zz%%zz%%zz%%zz%"
call :doClean "%zz% TEST" output
echo %output%
rem Time long string
echo %time%
for /l %%# in (1 1 100) do call :doClean "%zz%" output
echo %time%
exit /b
rem ---------------------------------------------------------------------------
:doClean input output
setlocal enableextensions enabledelayedexpansion
set "map=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 "
set "input=%~1"
set "output="
rem Step 1 - Remove critical delimiters
(
:purgeCritical
for /L %%z in (1 1 10) do (
for /f tokens^=1^-9^,^*^ delims^=^=^"^"^~^;^,^&^*^%%^:^!^(^)^<^>^^ %%a in ("!input!") do (
set "output=!output!%%a%%b%%c%%d%%e%%f%%g%%h%%i"
set "input=%%j"
)
if not defined input goto outPurgeCritical
)
goto purgeCritical
)
:outPurgeCritical
rem Step 2 - remove any remaining special character
(
:purgeNormal
for /L %%z in (1 1 10) do (
set "pending="
for /f "tokens=1,* delims=%map%" %%a in ("!output!") do (
set "output=!output:%%a=!"
set "pending=%%b"
)
if not defined pending goto outPurgeNormal
)
goto purgeNormal
)
:outPurgeNormal
endlocal & set "%~2=%output%"
goto :EOF
Maybe not the fastest, but at least a "decent" solution
#echo eof
call :purge "~~asd123#()%%%^"^!^"~~~^:^=asd^>^<bm_1" var
echo (%var%)
goto :eof
:purge StrVar [RtnVar]
setlocal disableDelayedExpansion
set "str1=%~1"
setlocal enableDelayedExpansion
for %%a in ( - ! # # $ % ^^ ^& + \ / ^< ^> . ' [ ] { } ` ^| ^" ) do (
set "str1=!str1:%%a=!"
)
rem dealing with some delimiters
set "str1=!str1:(=!"
set "str1=!str1:)=!"
set "str1=!str1:;=!"
set "str1=!str1:,=!"
set "str1=!str1:^^=!"
set "str1=!str1:^~=!"
set "temp_str="
for %%e in (%str1%) do (
set "temp_str=!temp_str!%%e"
)
endlocal & set "str1=%temp_str%"
setlocal disableDelayedExpansion
set "str1=%str1:!=%"
set "str1=%str1::=%"
set "str1=%str1:^^~=%"
for /f "tokens=* delims=~" %%w in ("%str1%") do set "str1=%%w"
endlocal & set "str1=%str1%"
endlocal & if "%~2" neq "" (set %~2=%str1%) else echo %str1%
goto :eof
Still cannot deal with ~ and = but working on it
EDIT: = now will be cleared
EDIT: ~ now will be cleared

Resources