Batch-Hybrid Special Character Fault? - Printable Version +- 0Day Forums (https://zeroday.vip) +-- Forum: Coding (https://zeroday.vip/Forum-Coding) +--- Forum: JScript (https://zeroday.vip/Forum-JScript) +--- Thread: Batch-Hybrid Special Character Fault? (/Thread-Batch-Hybrid-Special-Character-Fault) |
Batch-Hybrid Special Character Fault? - geocoronae818737 - 07-24-2023 As long as I know, some special characters can be displayed if you echo them using "". I'm simply stuck on the code, trying to figure out where I can change for this to work. I can't see the problem. Code from [here][1]. What i need is a special code that can do write animations for me, and then exit. Just like that. I've copied the code from [there][1], modified so it could be called using `typewriter.bat "text" "charsnum-1"`, like `typewriter "Hello" 4`. Though I don't *really* understand Batch Hybrids, and, even knowing how to interpret code, I can't see where the symbols are getting stuck at. To reproduce my problem: `typewriter.bat "Hello?" 5` Code: @if (@CodeSection == @Batch) @then @echo off setlocal color 70 set charnuu=%2 call :split chars %1 :begin for %%i in (%chars%) do call :type "%%~i" exit /b goto begin :split <var_to_set> <str> setlocal enabledelayedexpansion set "line=" set "str=%~2" for /L %%I in (0,1,%charnuu%) do set line=!line! "!str:~%%I,1!" endlocal & set "%~1=%line%" goto :EOF :type <char> cscript /nologo /e:JScript "%~f0" "%~1" goto :EOF @end // end batch / begin JScript chimera function pause() { WSH.Sleep(Math.random() * 50 + 50); } function odds(num) { return !(Math.round(Math.random() * num) % num) } pause(); if (odds(300)) WSH.Echo(''); if (!odds(400)) WSH.StdOut.Write(WSH.Arguments(0)); This code isn't showing common symbols or even the basic ones, like `?`. Maybe I am too tired to see it. Help me. [1]: [To see links please register here] RE: Batch-Hybrid Special Character Fault? - grig393 - 07-24-2023 Question marks can't be processed by regular `for` loops, but you can get around that by not processing the individual letters with a loop at all and just iterating over the entire string as a whole: @echo off REM Just kinda honor-system the string length since this is proof of concept REM but remember that string indices start at 0 set "string=%~1" set "string_length=%~2" REM Generate a backspace character for later for /f %%A in ('"prompt $H&for %%B in (1) do rem"') do set "BS=%%A" REM The setlocal is down here instead of at the top like it usually is to handle REM strings that contain exclamation points. REM There's a period followed by a backspace before the substring is printed in REM case the current character happens to be a space (which otherwise REM wouldn't get printed). REM The timeout /t 0 is because timeout is an external command that technically REM needs a few milliseconds to start up, so setting the wait period to 0 REM seconds actually generates a pause shorter than 1 second. setlocal enabledelayedexpansion for /L %%A in (0,1,%string_length%) do ( <nul set /p "=.%BS%!string:~%%A,1!" >nul timeout /t 0 ) |