【问题标题】:Scripting for windows窗口脚本
【发布时间】:2013-03-20 17:04:41
【问题描述】:

这是我第一次尝试编写脚本,我正在尝试创建一个小程序,在循环中执行简单的除法和 mod,然后计算 mod 结果的平均值。 这是我在 Linux .sh 中尝试过的,但我怎样才能使它与 Windows .bat 兼容?非常感谢您的帮助。

echo "enter first number:"
read first_num
echo “enter second number:”
read second_num
while [ first_num && second_num != 999 ]
do
    if [ second_num != 0 ]; then
        echo "Enter first number:"
        read first_num
        echo"Enter second number:"
        read second_num
        echo first_num "/" second_num "=" $((first_num / second_ num)) >> file.txt
    else
        echo "ERROR. Cannot divide by 0. Enter another number:"    
    fi
done
if [ first_num == 999 || second_num == 999 ]; then
   echo "You have exited the loop."
fi

#Mod 5 of numbers 1-100:
for i in {1...100}
do
    result=$((i % 5))
    echo i + "%5=" + result >> file.txt
done

#Average of results:
int sum=0
for (( i=1; i<101; i=i+1 ))
do    
    sum=sum+$((i % 5))
    average=$((sum/100))
    echo average
    echo average >> file.txt
done

【问题讨论】:

  • SET /P 接收输入; SET /A 做数学; IFFOR 可用; CALL 让您伪造代码块。你问的时候想到了什么样的答案?
  • 使用真正的脚本语言。例如 bash 或 sh。或者更好的是,Python。但是 cmd.exe 很烂。 Stack Overflow 不是移植服​​务。

标签: linux windows scripting batch-file


【解决方案1】:

希望您正在寻找这个:

@echo off
setlocal enabledelayedexpansion
> file.txt type nul
:loopInput
echo enter first number:
set /p first_num=
echo enter second number:
set /p second_num=

if !first_num! neq 0 (
    if !second_num! neq 999 (
        if !second_num! equ 0 (
            echo ERROR. Cannot divide by 0. Enter another number:
            goto loopInput
        )
        goto loopDiv
    )
)
goto :skipDiv

:loopDiv
set /a division=first_num/second_num

>> file.txt echo !first_num! / !second_num! = !division!
goto loopInput

:skipDiv
echo You have exited the div loop.

>> file.txt echo Mod 5 of numbers 1-100:
for /l %%a in (1,1,100) do (
    set /a mod=%%a%%5
    >> file.txt echo %%a %% 5 = !mod!
)

set sum=0
for /l %%a in (1,1,100) do (
    set /a sum+=%%a%%5
)
set /a average=sum/100
>> file.txt echo Average of results: !average!

【讨论】:

    【解决方案2】:
    echo "enter first number:"
    read first_num
    

    变成 set /p first_num="输入第一个数字"

    while [ first_num && second_num != 999 ]
    

    没有 WHILE - 必须连接它。想想俱乐部和岩石。

    :loop
    if %first_num%==999 goto endloop
    if %second_num%==999 goto endloop
    
    ...
    
    goto loop
    :endloop
    

    :name 是标签,%var% 检索 var 的内容 - 如果字符串包含空格,则始终是用引号括起来的字符串。

    if [ second_num != 0 ]; then
    

    翻译成

    if NOT %second_num%==0 ( ...things... ) else (...other things...)
    

    或者,当然

    if %second_num%==0 ( ...other things... ) else (...things...)
    

    怪癖:(其中之一):第一个左括号必须与IF 出现在同一物理行上,并且ELSE 必须与 on-true 的) 在同一物理行上状态序列。

    echo first_num "/" second_num "=" $((first_num / second_ num)) >> file.txt
    

    无法在回显中进行计算

    set /a result=(first_num / second_ num)
    

    set /a result=(%first_num% / %second_ num%)
    

    SET /A 应用算术表达式的结果 - 稍后添加和更多类似 C 的语义

    然后

    echo %first_num% / %second_num% = %result% >> file.txt
    

    纯粹将元素串在一起。

    接下来有一个小问题。在解析过程中,任何 %var% 都会被其 PARSE-TIME 值替换,并执行 THEN 该行。因此,上面的ECHO 行将显示输入 IF 语句时的值,而不是计算后的值。

    两种治疗方法:

    您可以使用SETLOCAL ENABLEDELATEDEXPANSION 切换解释器模式。在 DELAYEDEXPANSION 模式下,!var! 可用于检索var 的运行时间值。 SETLOCALENDLOCAL 或在同一上下文中到达 END-OF-FILE 终止。 SETLOCAL 之后的任何环境更改都由 ENDLOCAL 撤消,这就是为什么它通常在 @echo off 之后立即执行 - 保持环境清洁。

    第二种解决方法是使用子程序。 CALL :SUB(冒号的意思是“内部子程序 - 开始标签在这个批处理文件中”。省略它意味着“这是一个外部可执行文件”)CALL 创建一个新的上下文,复制当时存在的环境变量,所以

    :sub
    echo %first_num% / %second_num% = %result% >> file.txt
    goto :eof
    

    将显示环境中的变量,就像执行CALL :SUB 时一样。 请注意GOTO :EOF(冒号是REQUIRED 的意思是“转到文件的物理结尾” - 标签EOF 不应声明...

    (还要注意流向通常放置在批处理文件末尾的子例程。明智的GOTO :EOF 可确保不会发生流向...

    #Mod 5 of numbers 1-100:
    

    cmets指标官方为REM

    rem Mod 5 of numbers 1-100:
    

    但是

    ::Mod 5 of numbers 1-100:
    

    经常使用,因为它更容易键入 BUT,因为它实际上是对标签的误用,它实际上是一个标签,并且标签不能在复合语句中使用,你不能在括号内使用它IF ... (...) else (...)FOR...DO (...)

    for i in {1...100}
    

    变成

    for /L %%i in (1,1,100) do (
    

    元变量%%i 区分大小写且为单个字符。在 FOR /L 中,元素是 (start,step,end) - 请参阅提示中的 FOR /?(或通常从提示中看到 command /?)以获得 docco...

    result=$((i % 5))
    

    变成

    set /a result=%%i %% 5
    

    /a 因为 RHS 是要计算的算术表达式; %% 5 因为% 转义%,空间无关紧要,处理器需要知道正在使用MOD 运算符%,而不是%5(第五个命令行参数)

    int sum=0
    

    没有类型之类的东西;所有环境变量都是字符串,并且仅被set /a 语句解释为整数

    所以 - 这就是它的全部内容......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2017-07-29
      • 2017-12-25
      • 2012-10-25
      相关资源
      最近更新 更多