如何使用批处理文件交换变量中的每 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 方法的时间...
如何使用批处理脚本交换变量中的每 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 方法的时间...