具有可变子字符串长度的 Windows Batch SET?

Posted

技术标签:

【中文标题】具有可变子字符串长度的 Windows Batch SET?【英文标题】:Windows Batch SET with Variable Substring Length? 【发布时间】:2021-10-14 09:44:21 【问题描述】:

举个简单的例子:

@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 作为变量传递?感谢您的帮助。

【问题讨论】:

问题不在于您启用的延迟扩展,而在于您的endlocal,它将取消定义在延迟扩展块中定义或修改的任何变量。解决这个问题的最简单方法是用For %%G In ("!phrase:~0,%rnum%!") Do EndLocal & Set "rchar=%%G" 替换低代码中的78 非常感谢!这似乎行得通。只是一件事,尽管变量现在将结果包含在引号中,就像 phrase=1234567890rnum=6 的结果 ECHO %rchar%"123456" 而不仅仅是 123456。我确实使用了SET rchar=%rchar:"=%,这似乎可行,但是您提出的代码中还有其他方法吗?再次感谢。 对不起HTWingNut,只是我的一个错字,改成For %%G In ("!phrase:~0,%rnum%!") Do EndLocal & Set "rchar=%%~G"吧!另外请从您的问题中删除解决方案,您不应该为您的问题添加答案/解决方案,这些应该作为答案添加到适当的区域。随意添加它,你甚至可以在足够的时间里接受你自己的答案! @Compo - 谢谢。但我认为你的第一行是正确的,它给了我需要的结果。只是它在输出中包含引号,但我用SET rchar=%rchar:"=% 修复了它如果您想将其保留为实际答案,我很乐意将其标记为正确答案。谢谢。 【参考方案1】:

这是对示例延迟扩展代码的简单修改,它显示了一种将变量值保持在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% 可能不起作用,那么您最好在那时保持启用延迟扩展。

【讨论】:

【参考方案2】:

由于 Compo 已经 cets,您的 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

【讨论】:

虽然这行得通,但如果他们只想echo 它,则根本不需要定义rchar,即ECHO !phrase:~0,%rnum%! & endlocal 谢谢,但我想把它作为变量携带。

以上是关于具有可变子字符串长度的 Windows Batch SET?的主要内容,如果未能解决你的问题,请参考以下文章

创建一个使用描述列中的可变子字符串数据动态填充临时列的视图

将具有变量存在测试的 Windows Batch Scriptblock 传送到另一个命令 [重复]

文件名的最大长度是多少

Python入门-5函数:05参数的传递-可变对象-不可变对象-浅拷贝和深拷贝-不可变对象含可变子对象

Windows Batch 区分大小写的字符串变量

Windows Batch操作找到含字符串行并打印本行及后两行