如何在 Batch 中反转字符串?
How can I reverse a string in Batch?
我找到了这个用于反转字符串的解决方案,以前有用,但由于某种原因不再可用:
setlocal enabledelayedexpansion
set num=0
:LOOP
call set tmpa=%%advanced:~%num%,1%%%
set /a num+=1
if not "%tmpa%" equ "" (
set string1=%tmpa%%string1%
goto LOOP
)
我收到的消息是:
The input line is too long.
The syntax of the command is incorrect.
我只需要将变量%advanced%
中的字符串反转输出到%string1%
.
如果可以在一行中完成反转字符串,那将对我正在进行的项目非常有帮助。如果没有 setlocal enabledelayedexpansion
也能完成,那会更有帮助,但我怀疑这是否可能。
如果您更改为 set string1=!tmpa!!string1!
,则此方式有效
@echo off
setlocal enabledelayedexpansion
set "advanced=abcdefghijklmnopqrstuvwxyz!"
set "num=0"
:LOOP
call set "tmpa=%%advanced:~%num%,1%%%"
set /a num+=1
if not "%tmpa%" equ "" (
set "string1=!tmpa!!string1!"
goto LOOP
)
echo !string1!
endlocal
另一种方式更快一点:
@echo off
setlocal enabledelayedexpansion
set "advanced=abcdefghijklmnopqrstuvwxyz"
echo %advanced%>"%tmp%\alpha.tmp"
for %%l in ("%tmp%\alpha.tmp") do set /a len=%%~zl
set /a len-=2
set "reverse="
set "char="
for /l %%i in (0,1,%len%) do (
for /f "usebackq" %%a in ("%tmp%\alpha.tmp") do (
set "char=%%a"
set "reverse=!char:~%%i,1!!reverse!"
)
)
del "%tmp%\alpha.tmp"
echo !reverse!
endlocal
你说一开始有用,后来不行了;我认为简单地清除变量 string1
就可以了。您的代码应该可以正常工作。
接下来,您不需要启用延迟扩展,因为您没有使用它(!!
扩展)。
最后,您可以查询是否已定义,而不是询问 tmpa
是否为空(不过这是个人喜好问题)。
set string1=
set num=0
:LOOP
call set tmpa=%%advanced:~%num%,1%%%
set /a num+=1
if defined tmpa (
set string1=%tmpa%%string1%
goto :LOOP
)
另一种使用 BAT/VBS 的方法:
@echo off
set "advanced=1234567890"
echo WScript.Echo StrReverse("%advanced%"^) >reverse.vbs
for /f "delims=" %%a in ('cscript //nologo reverse.vbs') do set "$reversed=%%a"
>nul del reverse.vbs
echo reversed string --^> %$reversed%
反转字符串或文件内容:
REM eg. set string/content to file
set /p="Hello, world!"> test
certutil -encodehex -f test temp 4
REM reverse file contents
set rev=
(for /f "delims=" %i in (temp) do for %j in (%i) do set rev=%j !rev!)
set /p="%rev:~0,-6%">temp
certutil -decodehex temp out.txt
REM view content
more out.txt
已在 Windows 10 CMD 中测试
我找到了这个用于反转字符串的解决方案,以前有用,但由于某种原因不再可用:
setlocal enabledelayedexpansion
set num=0
:LOOP
call set tmpa=%%advanced:~%num%,1%%%
set /a num+=1
if not "%tmpa%" equ "" (
set string1=%tmpa%%string1%
goto LOOP
)
我收到的消息是:
The input line is too long.
The syntax of the command is incorrect.
我只需要将变量%advanced%
中的字符串反转输出到%string1%
.
如果可以在一行中完成反转字符串,那将对我正在进行的项目非常有帮助。如果没有 setlocal enabledelayedexpansion
也能完成,那会更有帮助,但我怀疑这是否可能。
如果您更改为 set string1=!tmpa!!string1!
@echo off
setlocal enabledelayedexpansion
set "advanced=abcdefghijklmnopqrstuvwxyz!"
set "num=0"
:LOOP
call set "tmpa=%%advanced:~%num%,1%%%"
set /a num+=1
if not "%tmpa%" equ "" (
set "string1=!tmpa!!string1!"
goto LOOP
)
echo !string1!
endlocal
另一种方式更快一点:
@echo off
setlocal enabledelayedexpansion
set "advanced=abcdefghijklmnopqrstuvwxyz"
echo %advanced%>"%tmp%\alpha.tmp"
for %%l in ("%tmp%\alpha.tmp") do set /a len=%%~zl
set /a len-=2
set "reverse="
set "char="
for /l %%i in (0,1,%len%) do (
for /f "usebackq" %%a in ("%tmp%\alpha.tmp") do (
set "char=%%a"
set "reverse=!char:~%%i,1!!reverse!"
)
)
del "%tmp%\alpha.tmp"
echo !reverse!
endlocal
你说一开始有用,后来不行了;我认为简单地清除变量 string1
就可以了。您的代码应该可以正常工作。
接下来,您不需要启用延迟扩展,因为您没有使用它(!!
扩展)。
最后,您可以查询是否已定义,而不是询问 tmpa
是否为空(不过这是个人喜好问题)。
set string1=
set num=0
:LOOP
call set tmpa=%%advanced:~%num%,1%%%
set /a num+=1
if defined tmpa (
set string1=%tmpa%%string1%
goto :LOOP
)
另一种使用 BAT/VBS 的方法:
@echo off
set "advanced=1234567890"
echo WScript.Echo StrReverse("%advanced%"^) >reverse.vbs
for /f "delims=" %%a in ('cscript //nologo reverse.vbs') do set "$reversed=%%a"
>nul del reverse.vbs
echo reversed string --^> %$reversed%
反转字符串或文件内容:
REM eg. set string/content to file
set /p="Hello, world!"> test
certutil -encodehex -f test temp 4
REM reverse file contents
set rev=
(for /f "delims=" %i in (temp) do for %j in (%i) do set rev=%j !rev!)
set /p="%rev:~0,-6%">temp
certutil -decodehex temp out.txt
REM view content
more out.txt
已在 Windows 10 CMD 中测试