【问题标题】:How can I run a command with a variable? /// How can I produce a random number with with a variable?如何运行带有变量的命令? /// 如何生成带有变量的随机数?
【发布时间】:2015-12-10 19:23:03
【问题描述】:

我知道 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”作为输出。

所以有两个问题:如何使用变量(或一些替代方法)普遍实现运行命令,也许更紧迫的是,如何在每个新命令调用时在命令行产生一个新的随机数?

【问题讨论】:

    标签: windows variables random command-line command-prompt


    【解决方案1】:

    您应该在将 zeroThroughNine 设置为命令之前设置 number,如下所示:

    set /a number=%Random%*9/32768
    set zeroThroughNine=echo %number%
    %zeroThroughNine%
    

    另外,由于 zeroThroughNine 已经一个 echo 命令,你不需要在它之前添加额外的 echo。

    编辑:

    考虑到你的 Random 计算是不必要的复杂,最终的代码应该是这样的(1 - 10 除外):

    set /a number=%Random% %% 10
    set zeroThroughNine=echo %number%
    %zeroThroughNine%
    

    重要的是,与其试图在一行中完成所有操作,不如将其分成两行来提高可读性。

    【讨论】:

    • 什么不起作用?我很乐意看看你是如何在上下文中使用它的,因为使用我的代码片段确实有效。
    • [i.imgur.com/mig6RqE.png] 他们都重复产生相同的数字。昨天我轮班结束时,我告诉你它正在工作。我只是累了哈哈。我看到它反复产生相同的数字,出于某种原因我很满意——其中一个时刻就像你试图把手机放在冰箱里:p
    【解决方案2】:

    The CALL SET syntax 允许评估 variable substringCALL page 对此技术有更多详细信息,在大多数情况下,更好的方法是使用 Setlocal EnableDelayedExpansion

    命令行(请注意,所有% 百分号都是escaped^%,并且>& 字符在一对" 双引号内转义:

    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脚本范围(注意!感叹号转义为^!):

    @echo OFF
    SETLOCAL EnableExtensions EnableDelayedExpansion
    set "_zeroThroughNine=set /a _number=^!Random^! %% 10 & 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
    

    【讨论】:

      【解决方案3】:

      查看this question。基本上,这是 %random% 环境变量如何工作的问题......

      编辑:

      详细地说,您的随机值始终为 7 的原因是因为 cmd 的伪随机数生成器是如何工作的,而不是因为变量的解释方式。 this answer 很好地解释了这个问题。

      基本上,在批处理文件的重复运行中,%RANDOM% 将产生一个非常接近前一次运行的值。因此,表达式%RANDOM%*9/32768 在每次单独运行中都会产生相同的结果,因为它是随机值。

      如果我理解正确,您要问的问题是如何更好地生成随机值 0 - 9(含),这将通过使用以下表达式:

      set /a zeroThroughNine=%RANDOM% %% 10
      

      【讨论】:

      • 这不是答案,您只提到他的问题是重复的。这很好,因为你做了他应该做的搜索
      • 好点,虽然那个问题的答案解释了为什么他的随机数每次都是 7。我不能同意你的观点,这不是一个答案,但可能是一个不完整的答案。也许这应该是一个评论?原谅我,我是新来的。
      • Tommy,我有一个“矩阵”bat 文件,可以调整命令提示符的属性,使其在主题上类似于《黑客帝国》。在这个 bat 文件中是一个 goto 循环,它触发了 96 个唯一变量的新计算,其中包含 %random% 环境变量和我的算术——然后是一个 echo 命令,它一个接一个地调用它们。结果是重复生成的 96 个单位数字的输出线,范围从 0 到 9。由此产生的效果隐约让人联想到矩阵。
      • 麻烦的是,为了让它工作,我不得不手动写出每个变量。但这无关紧要。当调用 goto 循环重写时,九十六个变量中的每一个都会创建令人满意的随机数。我只是想知道如何在命令行中做同样的事情
      猜你喜欢
      • 1970-01-01
      • 2014-09-30
      • 2016-12-06
      • 2023-04-06
      • 1970-01-01
      • 2020-11-18
      • 1970-01-01
      • 2021-10-06
      • 2017-05-18
      相关资源
      最近更新 更多