如何在 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 中测试