我尝试在批处理脚本中用~
替换{~}
的所有实例,这样VBScript就不会假设我将其传递给sendKeys时按Enter键,但是,变量不断被替换它的文字字符串替换。
例如,
rem Intended function;
rem input = Hello~world.
rem output = Hello{~}world.
但是每次都没有做任何事情,或者将refVar设置为文字字符串refVar:~={~}
。
这是我尝试过的;
set refVar=!refVar:~={~}!
rem Also
set refVar=%refVar:~={~}%
rem and...
set refVar=%refVar:^~=^{^~^}%
rem and of course;
set refVar=!refVar:^~=^{^~^}!
rem and even:
set "pre=~"
set "post={~}"
set refVar=%refVar:!pre!=!post!%
rem and the same set commands with;
set refVar=!refVar:%pre%=%post%!
我错过了逃避这种方法的方法吗?我非常确定它与~
是类似命令中的位置字符有关。
我知道在VBScript中可能有一种方法可以解决这个问题,但这让我有一个限制而没有明显的解决方法。
答案 0 :(得分:4)
所以我做了一些挖掘,看起来这真的很难。但是,我确实找到了解决问题的this,并将其作为代码提供给我们:
@echo off
set "input=Hello~world."
echo input: %input%
call :wavereplacer "%input%" {tilde} output
set output=%output:{tilde}={~}%
echo output: %output%
pause
::your own code should be above this.
goto :eof
:wavereplacer String Replacer [RtnVar]
setlocal
rem the result of the operation will be stored here
set "result=#%~1#"
set "replacer=%~2"
call :strlen0.3 result wl
call :strlen0.3 replacer rl
:start
set "part1="
set "part2="
rem splitting the string on two parts
for /f "tokens=1* delims=~" %%w in ("%result%") do (
set "part1=%%w"
set "part2=%%x"
)
rem calculating the count replace strings we should use
call :strlen0.3 part1 p1l
call :strlen0.3 part2 p2l
set /a iteration_end=wl-p1l-p2l
rem creating a sequence with replaced strings
setlocal enableDelayedExpansion
set "sequence="
for /l %%i in (1,1,%iteration_end%) do (
set sequence=!sequence!%replacer%
)
endlocal & set "sequence=%sequence%"
rem adjust the string length
set /a wl=wl+iteration_end*(rl-1)
rem replacing for the current iteration
set result=%part1%%sequence%%part2%
rem if the second part is empty the task is over
if "%part2%" equ "" (
set result=%result:~1,-1%
goto :endloop
)
goto :start
:endloop
endlocal & if "%~3" neq "" (set %~3=%result%) else echo %result%
exit /b
:strlen0.3 StrVar [RtnVar]
setlocal EnableDelayedExpansion
set "s=#!%~1!"
set "len=0"
for %%A in (2187 729 243 81 27 9 3 1) do (
set /A mod=2*%%A
for %%Z in (!mod!) do (
if "!s:~%%Z,1!" neq "" (
set /a "len+=%%Z"
set "s=!s:~%%Z!"
) else (
if "!s:~%%A,1!" neq "" (
set /a "len+=%%A"
set "s=!s:~%%A!"
)
)
)
)
endlocal & if "%~2" neq "" (set %~2=%len%) else echo %len%
exit /b
这不能立即将~
替换为{~}
,您需要使用临时替换,在这种情况下{tilde}
答案 1 :(得分:2)
我提供了一个更简单的解决方案,用括号中的波形符替换环境变量的值字符串中的每个波形符,而不是Dennis van Gils,这对于此任务也很好。
@echo off
set "TestVar=hello~world."
echo TestVar has value: %TestVar%
call :SpecialReplace "TestVar"
echo TestVar has value: %TestVar%
goto :EOF
rem The subroutine below expects the name of an environment variable as
rem parameter. The subroutine does nothing if called without parameter.
rem Also nothing is done if specified environment variable is not defined.
rem Each tilde character in value of this environment variable is replaced
rem by {~} by this subroutine.
rem Note: This subroutine can be also easily modified to replace other
rem special characters like the equal sign by a different string which
rem can be also no string in case of special character should be removed.
rem Just modify Search and Replace variables for a different replace. But
rem be aware of more code must be changed if search string is longer than
rem one character. Length of replace string does not matter on code below.
:SpecialReplace
if "%~1" == "" exit /B
setlocal EnableDelayedExpansion
set "VarName=%~1"
set "VarValue=!%VarName%!"
if "!VarValue!" == "" endlocal & exit /B
set "NewValue="
set "Search=~"
set "Replace={~}"
:ReplaceLoop
if "!VarValue:~0,1!" == "!Search!" (
set "NewValue=!NewValue!!Replace!"
) else (
set "NewValue=!NewValue!!VarValue:~0,1!"
)
set "VarValue=!VarValue:~1!"
if not "!VarValue!" == "" goto ReplaceLoop
endlocal & set "%VarName%=%NewValue%" & exit /B
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
call /?
echo /?
endlocal /?
exit /?
goto /?
if /?
rem /?
set /?
setlocal /?
另请参阅Single line with multiple commands using Windows batch file上的答案,了解两条命令如何在命令之间使用单个&符号的多个命令。
以上变体,其中包含扩展子例程SpecialReplace
,支持现在变量搜索并替换Dennis van Gils建议的指定为第二和第三参数的字符串。
@echo off
set "TestVar=hello~world."
echo TestVar has value: %TestVar%
call :SpecialReplace "TestVar" "~" "{~}"
echo TestVar has value: %TestVar%
goto :EOF
rem The subroutine below expects the name of an environment variable as
rem first parameter. The subroutine does nothing if called without parameter.
rem Also nothing is done if specified environment variable is not defined.
rem The second parameter must be the search string. The subroutine does
rem nothing if there is no second parameter which can be also just one
rem or two double quotes enclosed in double quotes.
rem The third parameter is an optional replace string. Without a third
rem parameter all occurrences of search string are removed from value
rem of the specified environment variable.
rem With just one or two double quotes in double quotes as search string
rem no replace string can be defined because command processor does not
rem parse the quote strings as most would expect it. But """ or """" as
rem search string with no replace string works and results in removing
rem all double quotes or all occurrences of two double quotes.
:SpecialReplace
if "%~1" == "" exit /B
setlocal EnableDelayedExpansion
set "VarName=%~1"
set "VarValue=!%VarName%!"
if "!VarValue!" == "" endlocal & exit /B
set "NewValue="
set "Search=%~2"
if "!Search!" == "" endlocal & exit /B
set "Replace=%~3"
set "Length=0"
:GetLength
if "!Search:~%Length%,1!" == "" goto ReplaceLoop
set /A Length+=1
goto GetLength
:ReplaceLoop
if "!VarValue:~0,%Length%!" == "!Search!" (
set "NewValue=!NewValue!!Replace!"
set "VarValue=!VarValue:~%Length%!"
) else (
set "NewValue=!NewValue!!VarValue:~0,1!"
set "VarValue=!VarValue:~1!"
)
if not "!VarValue!" == "" goto ReplaceLoop
endlocal & set "%VarName%=%NewValue%" & exit /B
答案 2 :(得分:1)
@ECHO Off
SETLOCAL ENABLEDELAYEDEXPANSION
SET "input=hello~world"
SET "xhead=!input:%input:*~=%=!"
SET "output=!input:%xhead%=%xhead:~0,-1%{~}!"
ECHO %input% --^> %output%
GOTO :EOF
如果只有一个~
并且它不是初始或终端字符,这似乎有效。