Windows 具有可变子字符串长度的批处理 SET?
Windows Batch SET with Variable Substring Length?
举个简单的例子:
@ECHO OFF
SET /P phrase="Enter Word : "
SET /a rnum=%random% %%10 +1
ECHO %phrase%
ECHO %rnum%
SET rchar=%phrase:~0,%rnum%%
ECHO %rchar%
Pause
我只是希望能够传递那个 rnum
变量来选择它作为从该用户输入的单词左侧选择的字符到那个随机字符。
我似乎不知道如何将其作为变量传递。
我试过 enabledelayedexpansion
但没有成功:
@ECHO OFF
SET /P Phrase="Enter Word : "
SET /a rnum=%random% %%10 +1
ECHO %phrase%
ECHO %rnum%
setlocal enabledelayedexpansion
SET rchar=!phrase:~0,%rnum%!
endlocal
ECHO %rchar%
Pause
那么在这种情况下如何将 rnum
作为变量传递?感谢您的帮助。
正如 Compo 已经评论的那样,您 endlocal
的位置是问题所在。
您可以在 echo
之后移动 endlocal
@ECHO OFF
setlocal enabledelayedexpansion
SET /P Phrase="Enter Word : "
SET /a rnum=%random% %%10 +1
ECHO !phrase!
ECHO !rnum!
SET "rchar=!phrase:~0,%rnum%!"
ECHO !rchar!
endlocal
这是对您的示例延迟扩展代码的简单修改,它显示了一种将变量值保持在 endlocal
之外的方法:
@ECHO OFF
SET /P "phrase=Enter Word : "
SET /A rnum = %RANDOM% %% 10 + 1
ECHO %phrase%
ECHO %rnum%
SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%G IN ("!phrase:~0,%rnum%!") DO ENDLOCAL & SET "rchar=%%~G"
ECHO rchar=%rchar%
PAUSE
只要最终用户不开始输入带有问题字符的字符串,上面的示例应该没问题。如果你想让它在这种情况下更健壮一点,那么这可能会有所帮助:
@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
:AskString
Rem Get interactive string input
Set "String="
Set /P String="Enter Word : "
If Not Defined String GoTo AskString
Set String
Rem Generate a random integer 1..10
Set /A "Integer = (%RANDOM% %% 10) + 1"
Set Integer
Rem Create a substring variable using %String% and %Integer%
Echo %%SubString%% = %%String:~0,%Integer%%%
SetLocal EnableDelayedExpansion
For /F Delims^=^ EOL^=^ UseBackQ %%G In ('"!String:~0,%Integer%!"') Do (
EndLocal
Set "SubString=%%~G"
)
Set SubString
Pause
请注意,上面的代码使用 Set Variable
来显示变量名称及其值。如果您的变量包含某些有毒字符,仅使用 Echo %Variable%
可能不起作用,您最好在那时保持延迟扩展启用。
举个简单的例子:
@ECHO OFF
SET /P phrase="Enter Word : "
SET /a rnum=%random% %%10 +1
ECHO %phrase%
ECHO %rnum%
SET rchar=%phrase:~0,%rnum%%
ECHO %rchar%
Pause
我只是希望能够传递那个 rnum
变量来选择它作为从该用户输入的单词左侧选择的字符到那个随机字符。
我似乎不知道如何将其作为变量传递。
我试过 enabledelayedexpansion
但没有成功:
@ECHO OFF
SET /P Phrase="Enter Word : "
SET /a rnum=%random% %%10 +1
ECHO %phrase%
ECHO %rnum%
setlocal enabledelayedexpansion
SET rchar=!phrase:~0,%rnum%!
endlocal
ECHO %rchar%
Pause
那么在这种情况下如何将 rnum
作为变量传递?感谢您的帮助。
正如 Compo 已经评论的那样,您 endlocal
的位置是问题所在。
您可以在 echo
@ECHO OFF
setlocal enabledelayedexpansion
SET /P Phrase="Enter Word : "
SET /a rnum=%random% %%10 +1
ECHO !phrase!
ECHO !rnum!
SET "rchar=!phrase:~0,%rnum%!"
ECHO !rchar!
endlocal
这是对您的示例延迟扩展代码的简单修改,它显示了一种将变量值保持在 endlocal
之外的方法:
@ECHO OFF
SET /P "phrase=Enter Word : "
SET /A rnum = %RANDOM% %% 10 + 1
ECHO %phrase%
ECHO %rnum%
SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%G IN ("!phrase:~0,%rnum%!") DO ENDLOCAL & SET "rchar=%%~G"
ECHO rchar=%rchar%
PAUSE
只要最终用户不开始输入带有问题字符的字符串,上面的示例应该没问题。如果你想让它在这种情况下更健壮一点,那么这可能会有所帮助:
@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
:AskString
Rem Get interactive string input
Set "String="
Set /P String="Enter Word : "
If Not Defined String GoTo AskString
Set String
Rem Generate a random integer 1..10
Set /A "Integer = (%RANDOM% %% 10) + 1"
Set Integer
Rem Create a substring variable using %String% and %Integer%
Echo %%SubString%% = %%String:~0,%Integer%%%
SetLocal EnableDelayedExpansion
For /F Delims^=^ EOL^=^ UseBackQ %%G In ('"!String:~0,%Integer%!"') Do (
EndLocal
Set "SubString=%%~G"
)
Set SubString
Pause
请注意,上面的代码使用 Set Variable
来显示变量名称及其值。如果您的变量包含某些有毒字符,仅使用 Echo %Variable%
可能不起作用,您最好在那时保持延迟扩展启用。