如何使用批处理文件交换变量中的每 2 个值?

How to swap every 2 value in a variable using batch file?

如何使用批处理脚本交换变量中的每 2 个值?

例如:

CVDF1234 ---> VCFD2143

我已经为批处理脚本的变量设置了初始值。

@echo off
set "sValue=CVDF1234"
...
...
echo newsValue

我应该填写哪些缺失的步骤?

***我正在使用 Windows 10 个 64 位 OS

提前致谢。

@ECHO OFF
SETLOCAL
set "sValue=CVDF1234"
CALL :swap2 svalue newsvalue
ECHO %svalue%
ECHO %newsvalue%
GOTO :EOF

:: swap each 2 characters in %1 to %2

:swap2
setlocal
CALL SET "=%%%1%%"
SET "="
:Swap2L
SET "=%%%:~1,1%%:~0,1%"
SET "=%:~2%"
IF DEFINED  GOTO swap2L
endlocal&SET "%2=%%"
GOTO :eof

作为练习 - 它可能有什么用,IDK。

提供原始变量名和接收变量名作为两个参数,简单call例程:swap2

这将 $1 和 $2 建立为临时变量(setlocal/endlocal 括号使它们成为临时变量)- call 将 $1 设置为第一个变量的内容,然后只需构建 </code> 从该字符串的前 2 个字符开始倒序,删除 <code> 的前 2 个字符并继续直到 </code> 为空。</p> <p>然后使用解析技巧将 <code> 的结果分配给 %2

@TessellatingHeckler can this work on old-style batch files ?

如果你有 Windows 10,你有 PowerShell,所以这取决于你的意思:

set sValue=CVDF1234
for /f "usebackq" %%r in (`powershell "'%sValue%' -replace '(.)(.)',''"`) do (
    set newsValue=%%r )
echo %newsValue%

另一个旋转(只是为了好玩)

@echo off
setlocal enabledelayedexpansion
set "sValue=CVDF1234"
set /a i=0, i1=1, i2=2
:lp
if not "!sValue:~%i1%!"=="" (
  set sValue=!sValue:~0,%i%!!sValue:~%i1%,1!!sValue:~%i%,1!!sValue:~%i2%!
  set /a i+=2, i1+=2, i2+=2
  goto lp
)
@echo off
setlocal

set "sValue=CVDF1234"
set "newsValue="

:loop
   set "newsValue=%newsValue%%sValue:~1,1%%sValue:~0,1%"
   set "sValue=%sValue:~2%"
if defined sValue goto loop

echo %newsValue%

如果字符对的数量是固定的(在这个例子中是 4 个),该方法可能 运行 更快:

@echo off
setlocal EnableDelayedExpansion

set "sValue=CVDF1234"
set "newsValue="

for /L %%i in (1,1,4) do (
   set "newsValue=!newsValue!!sValue:~1,1!!sValue:~0,1!"
   set "sValue=!sValue:~2!"
)

echo %newsValue%

我邀请您比较此方法与 PowerShell 方法的时间...