2015-10-09 26 views
1

我發現這個解決方案爲扭轉這一工作過的字符串,而沒有任何更多的出於某種原因:如何在批處理中反轉字符串?

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的情況下完成,那會更有幫助,但我懷疑這是可能的。

+1

多久你輸入的字符串?批量字符串只能有8192個字符長,如果您收到錯誤消息說您的輸入行太長,您將遇到問題。 – SomethingDark

+1

你的字符串中可能有一些字符正在破壞代碼,如'%'或'!'或')'或'&'。 – SomethingDark

+1

您的代碼啓用延遲擴展,但不會使用它。如果使用延遲擴展,使用雙倍百分比的CALL要慢得多。 – dbenham

回答

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 
) 
+0

我試過這個,它絕對奏效!真棒! – DragonZeith

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