我知道set zeroThroughNine=%Random%*9/32768
后跟echo %zeroThroughNine%
会产生一个0到9之间的随机数。但似乎解释器并没有评估变量的内容每次调用它时,echo %zeroThroughNine%
每次都会产生7次。
我查找了一个使用变量运行命令的方法,以便我可以尝试强制它工作。我喜欢这个问题,因为它的方法非常基础; "如何使用变量运行命令?",适当标记。我没有太在意答案,因为它非常狭窄。最高投票和选择的答案是:
简单。只需运行
set commandVar=echo "Hello world."
,然后运行echo %commandVar%
。
当然,事实是只适用于echo命令。 >:[
无论如何,我会停止抱怨。这就是我尝试过的:
set zeroThroughNine=set /a number=%Random%*9/32768 & echo %number%
后跟echo %zeroThroughNine%
不幸的是,我的SET命令的& echo %number%
部分立即运行,产生" %number%
"作为输出 - 并使用echo %zeroThroughNine%
生成" set /a number=8436*9/32768
",例如,作为输出。
所以有两个问题:如何通过使用变量(或一些替代方法)来普遍实现运行命令,也许更加紧迫,如何在命令行中使用每个新命令调用来生成新的随机数?
答案 0 :(得分:1)
在将zeroThroughNine设置为命令之前,应该设置数字,如下所示:
set /a number=%Random%*9/32768
set zeroThroughNine=echo %number%
%zeroThroughNine%
此外,由于zeroThroughNine已经是一个echo命令,因此您无需在它之前添加额外的回声。
编辑:
考虑到你的随机计算是不必要的复杂,最终的代码应该是这样的(1 - 10独家):
set /a number=%Random% %% 10
set zeroThroughNine=echo %number%
%zeroThroughNine%
重要的是,不是试图在一条线上完成所有操作,而是将其分成两部分,使其更具可读性。
答案 1 :(得分:0)
The CALL SET
syntax允许对variable substring进行评估,CALL page有更多关于此技术的详细信息,在大多数情况下,更好的方法是使用Setlocal EnableDelayedExpansion
< / em>的。
命令行(请注意,所有%
百分号均为escaped ^%
,>
和&
个字符在一对{{}内转义1}}双引号:
"
批处理脚本, set "zeroThroughNine=call set /a number=^%Random^% ^% 10>nul & call echo number=^%number^%"
%zeroThroughNine%
for /L %G in (1, 1, 10) do @%zeroThroughNine%
方法(请注意,所有CALL
百分号都会转义为%
):
%%
批量脚本, @echo OFF
SETLOCAL
set "_zeroThroughNine=call set /a _number=%%Random%% %%%% 10 & call echo number=%%_number%%"
echo check variables
set _
echo output
%_zeroThroughNine%
for /L %%G in (1,1,10) do %_zeroThroughNine%
echo check variables after evaluating
set _
ENDLOCAL
仅用于输出:
EnableDelayedExpansion
批量脚本, @echo OFF
SETLOCAL EnableExtensions DisableDelayedExpansion
set "_zeroThroughNine=set /a _number=!Random! %% 10 & echo Number=!_number!"
SETLOCAL EnableDelayedExpansion
echo check variables
set _
echo output
%_zeroThroughNine%
for /L %%G in (1,1,10) do %_zeroThroughNine%
echo check variables after evaluating
set _
ENDLOCAL
ENDLOCAL
脚本范围(请注意,EnableDelayedExpansion
感叹号会被转义为!
):
^!
答案 2 :(得分:-1)
结帐this question。基本上,这是%random%环境变量如何工作的问题......
编辑:
详细说明,随机值始终为7的原因是因为cmd的伪随机数生成器的工作原理,而不是因为解释变量的方式。在this answer中很好地解释了这个问题。
基本上,在重复运行批处理文件时,%RANDOM%将生成一个非常接近上一次运行的值。因此,由于随机值,表达式%RANDOM%*9/32768
在每次单独运行中产生相同的结果。
如果我理解正确,你问的问题是如何更好地生成0到9的随机值,这可以通过使用以下表达式来实现:
set /a zeroThroughNine=%RANDOM% %% 10