如何在Batch中反转字符串?

时间:2015-10-09 23:55:27

标签: string batch-file reverse

我找到了这种解决方案,用于反转之前有效的字符串,但由于某种原因不再存在:

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的情况下完成,那将更有帮助,但我怀疑它是否有可能。

3 个答案:

答案 0 :(得分:2)

这样,如果您更改为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

答案 1 :(得分:2)

你说它先工作,后来又不再了;我认为只需清除变量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
)

答案 2 :(得分:2)

使用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%