Bat脚本-Call,Start,直接调用,goto 四种方式调用批处理

2023-12-08 0 203
目录
  • 1、call命令
    • 1.1调用批处理
    • 1.2调用目标标签
  • 2、调用call 和不用call 的区别
    • 3、goto 命令
      • 4、start类似于创建一个线程
        • 以下是补充
          • 主要用途
            • start的语法就是
              • 小结

                1、call命令

                CALL从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。call命令主要有2种用法,一种是调用其他批处理程序(*.bat,*.exe,*.cmd,*.COM),目前常用的是*.exe文件和*.bat文件;另一种是CALL :label arguments

                C:\\Users\\Administrator>help call从批处理程序调用另一个批处理程序。CALL [drive:][path]filename [batch-parameters] batch-parameters 指定批处理程序所需的命令行信息。如果命令扩展被启用,CALL 会如下改变:CALL 命令现在将卷标当作 CALL 的目标接受。语法是: CALL:label arguments一个新的批文件上下文由指定的参数所创建,控制在卷标被指定后传递到语句。您必须通过达到批脚本文件末两次来 "exit" 两次。第一次读到文件末时,控制会回到 CALL 语句的紧后面。第二次会退出批脚本。键入GOTO /?,参看 GOTO :EOF 扩展的描述,此描述允许您从一个批脚本返回。另外,批脚本文本参数参照(%0、%1、等等)已如下改变: 批脚本里的 %* 指出所有的参数(如 %1 %2 %3 %4 %5 …) 批参数(%n)的替代已被增强。您可以使用以下语法: %~1 – 删除引号("),扩展 %1 %~f1 – 将 %1 扩展到一个完全合格的路径名 %~d1 – 仅将 %1 扩展到一个驱动器号 %~p1 – 仅将 %1 扩展到一个路径 %~n1 – 仅将 %1 扩展到一个文件名 %~x1 – 仅将 %1 扩展到一个文件扩展名 %~s1 – 扩展的路径只含有短名 %~a1 – 将 %1 扩展到文件属性 %~t1 – 将 %1 扩展到文件的日期/时间 %~z1 – 将 %1 扩展到文件的大小 %~$PATH:1 – 查找列在 PATH 环境变量的目录,并将 %1 扩展到找到的第一个完全合格的名称。如果 环境变量名未被定义,或者没有找到文件, 此修改符会扩展到空字符串 可以组合修改符来取得多重结果: %~dp1 – 只将 %1 扩展到驱动器号和路径 %~nx1 – 只将 %1 扩展到文件名和扩展名 %~dp$PATH:1 – 在列在 PATH 环境变量中的目录里查找 %1, 并扩展到找到的第一个文件的驱动器号和路径。 %~ftza1 – 将 %1 扩展到类似 DIR 的输出行。 在上面的例子中,%1 和 PATH 可以被其他有效数值替换。 %~ 语法被一个有效参数号码终止。%~ 修定符不能跟 %* 使用

                1.1调用批处理

                命令格式CALL [drive:][path]filename [batch-parameters]

                创建文件test.bat 调用文件call.bat

                @echo off
                set a=环境变量
                call call.bat hi hello
                pause
                exit /b 0
                ::call.bat
                echo %1
                echo %2
                echo %a%

                运行结果如下:

                Bat脚本-Call,Start,直接调用,goto 四种方式调用批处理

                注意:

                1、只在test.bat中使用命令@echo off,call.bat中也没有回显命令;

                2、在test.bat中设置环境变量,call.bat中可使用该变量

                1.2调用目标标签

                注意:

                1、调用标签时需要“:”2、调用标签后继续处理后面命令

                实例一

                @echo off
                call :interCall hi hello
                echo 下一步
                pause
                exit /b 0

                :intercall
                echo %1
                echo %2

                运行结果:

                Bat脚本-Call,Start,直接调用,goto 四种方式调用批处理

                实例二

                @echo off
                call :interCall
                echo 下一步
                :intercall
                echo hi
                echo hello
                PAUSE
                exit /b 0

                Bat脚本-Call,Start,直接调用,goto 四种方式调用批处理

                2、调用call 和不用call 的区别

                1、使用call不终止父处理进程,不用call 调用批处理后,父处理进程终止,不再处理后续命令

                rem test.bat
                @echo off
                set a=环境变量
                call call.bat hi hello
                echo 下一步
                pause
                exit /b 0
                rem call.bat
                echo %1
                echo %2
                echo %a%
                pause

                Bat脚本-Call,Start,直接调用,goto 四种方式调用批处理

                2.2去掉call call.bat hi hello中的call运行结果如下:

                Bat脚本-Call,Start,直接调用,goto 四种方式调用批处理

                3、goto 命令

                帮助文档如下

                C:\\Users\\Administrator>help goto将 cmd.exe 定向到批处理程序中带标签的行。GOTO label label 指定批处理程序中用作标签的文字字符串。标签必须单独一行,并且以冒号打头。如果命令扩展被启用,GOTO 会如下改变:GOTO 命令现在接受目标标签 :EOF,这个标签将控制转移到当前批脚本文件的结尾。不定义就退出批脚本文件,这是一个容易的办法。有关能使该功能有用的 CALL 命令的扩展描述,请键入CALL /?。

                3.1 goto 后面不需要":",直接加label

                3.2 goto 跳至指定label后,不会处理被跳过的命令语句

                @echo off
                goto interCall
                echo 下一步
                :intercall
                echo hi
                echo hello
                PAUSE
                exit /b 0

                运行结果:并没有处理“echo 下一步”该语句

                Bat脚本-Call,Start,直接调用,goto 四种方式调用批处理

                4、start类似于创建一个线程

                C:\\Users\\Administrator>help start启动一个单独的窗口运行指定的程序或命令。START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED] [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL] [/NODE <NUMA node>] [/AFFINITY <hex affinity mask>] [/WAIT] [/B] [command/program] [parameters] "title" 在窗口标题栏中显示的标题。 path 启动目录。 B 启动应用程序,但不创建新窗口。应用程序已忽略 ^C 处理。 除非应用程序启用 ^C 处理,否则 ^Break 是唯一可以中断 该应用程序的方式。 I 新的环境将是传递给 cmd.exe 的原始环境,而不是当前环境。 MIN 以最小化方式启动窗口。 MAX 以最大化方式启动窗口。 SEPARATE 在单独的内存空间中启动 16 位 Windows 程序。 SHARED 在共享内存空间中启动 16 位 Windows 程序。 LOW 在 IDLE 优先级类中启动应用程序。 NORMAL 在 NORMAL 优先级类中启动应用程序。 HIGH 在 HIGH 优先级类中启动应用程序。 REALTIME 在 REALTIME 优先级类中启动应用程序。 ABOVENORMAL 在 ABOVENORMAL 优先级类中启动应用程序。 BELOWNORMAL 在 BELOWNORMAL 优先级类中启动应用程序。 NODE 将首选非一致性内存结构 (NUMA) 节点指定为十进制整数。 AFFINITY 将处理器关联掩码指定为十六进制数字。进程被限制在这些 处理器上运行。 当 /AFFINITY 和 /NODE 结合时,会对关联掩码进行不同的解释。 指定关联掩码,正如 NUMA 节点的处理器掩码正确移动到零位 起始位置一样。进程被限制在指定关联掩码和 NUMA 节点之间的 那些通用处理器上运行。如果没有通用处理器,则进程被限制在 指定的 NUMA 节点上运行。 WAIT 启动应用程序并等待它终止。 command/program 如果它是内部 cmd 命令或批文件,则该命令处理器是使用 cmd.exe 的 /K 开关运行的。这表示运行该命令之后,该窗口 将仍然存在。 如果它不是内部 cmd 命令或批文件,则它就是一个程序,并将 作为一个窗口化应用程序或控制台应用程序运行。 parameters 这些是传递给 command/program 的参数。注意: 在 64 位平台上不支持 SEPARATE 和 SHARED 选项。通过指定 /NODE,可按照利用 NUMA 系统中的内存区域的方式创建进程。例如,可以创建两个完全通过共享内存互相通信的进程以共享相同的首选 NUMA 节点,从而最大限度地减少内存延迟。如有可能,它们即会分配来自相同 NUMA 节点的内存,并且会在指定节点之外的处理器上自由运行。 启动 /NODE 1 application1.exe 启动 /NODE 1 application2.exe这两个进程可被进一步限制在相同 NUMA 节点内的指定处理器上运行。在以下示例中, application1 在节点的两个低顺序处理器上运行,而 application2在该节点的其后两个处理器上运行。该示例假定指定节点至少具有四个逻辑处理器。请注意,节点号可更改为该计算机的任何有效节点号,而无需更改关联掩码。 启动 /NODE 1 /AFFINITY 0x3 application1.exe 启动 /NODE 1 /AFFINITY 0xc application2.exe如果命令扩展被启用,通过命令行或 START 命令的外部命令调用会如下改变:将文件名作为命令键入,非可执行文件可以通过文件关联调用。 (例如,WORD.DOC 会调用跟 .DOC 文件扩展名关联的应用程序)。 关于如何从命令脚本内部创建这些关联,请参阅 ASSOC 和FTYPE 命令。执行的应用程序是 32-位 GUI 应用程序时,CMD.EXE 不等应用程序终止就返回命令提示符。如果在命令脚本内执行,该新行为则不会发生。如果执行的命令行的第一个符号是不带扩展名或路径修饰符的字符串 "CMD","CMD" 会被 COMSPEC 变量的数值所替换。这防止从当前目录提取 CMD.EXE。如果执行的命令行的第一个符号没有扩展名,CMD.EXE 会使用PATHEXT 环境变量的数值来决定要以什么顺序寻找哪些扩展名。PATHEXT 变量的默认值是: .COM;.EXE;.BAT;.CMD 请注意,该语法跟 PATH 变量的一样,分号隔开不同的元素。查找可执行文件时,如果没有相配的扩展名,看一看该名称是否与目录名相配。如果确实如此,START 会在那个路径上调用Explorer。如果从命令行执行,则等同于对那个路径作 CD /D。

                4.1 可以和 第2段“调用call 和不用call 的区别” 代码作对比

                @echo off
                set a=环境变量
                start call.bat hi hello
                echo 下一步
                pause
                exit /b 0

                call.bat内容如下

                rem call.bat
                echo %1
                echo %2
                echo %a%
                pause

                运行结果

                Bat脚本-Call,Start,直接调用,goto 四种方式调用批处理

                Bat脚本-Call,Start,直接调用,goto 四种方式调用批处理

                以下是补充

                call的语法如下

                CALL [drive:][path] filename [batch-parameters]

                其中参数: [Drive:][Path] FileName

                就是指定要调用的批处理程序的位置和名称。

                注意的是 filename 参数必须具有 .bat 或 .cmd 扩展名,

                这样程序才能被条用。

                [batch-parameters] 就是输入的参数

                例如

                建立一个脚本test2.bat

                内容为

                echo "bat2"

                echo %1

                echo %~1

                就可以直接使用

                call test2.bat arg1

                Bat脚本-Call,Start,直接调用,goto 四种方式调用批处理

                主要用途

                就是在脚本1中,使用call命令调用的脚本2的时候,

                会先执行完脚本2然后在继续执行脚本1。

                所有这回使用脚本直接调用test2.bat

                内容如下

                call test2.bat arg1

                echo "this is test1.bat"

                Bat脚本-Call,Start,直接调用,goto 四种方式调用批处理

                start的语法就是

                START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]

                [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]

                [/NODE <NUMA node>] [/AFFINITY <hex affinity mask>] [/WAIT] [/B]

                [command/program] [parameters]

                主要的用途就是

                直接调用程序,

                所有的dos和命令行程序都可以由其启动

                例如

                start explorer d:\\

                就是直接启动D盘

                所以综上所述,

                就会发现,

                1.调用的程序类型不一样,

                call必须是bat脚本

                2. 调用的方式不一样,

                call 会暂停当前脚本,等待调用的脚步运行结束后,在运行当前脚本,

                start就会开启一个窗口直接调用程序,相当于启动一个新的进程运行程序。而不会等待调用的程序运行结束

                小结

                批处理:Call,Start,直接调用,三种方式调用批处理;

                call:属于调用的方式,在A.bat中call B. bat,B.bat执行完成后会回到A.bat,且只有一个线程工作;Start:属于在新建一个线程执行bat,在A.bat中Start B. bat,点击执行后,会出现两个线程,A.bat和B.bat各占一个线程;直接调用:属于在当前线程上内容的跳转,在A. bat中直接调用B. bat,点击执行后,线程的所有权限会转交给B. bat,如果B.bat退出线程后,则不会跳回 A.bat。

                收藏 (0) 打赏

                感谢您的支持,我会继续努力的!

                打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
                点赞 (0)

                悠久资源 DOS/BAT Bat脚本-Call,Start,直接调用,goto 四种方式调用批处理 https://www.u-9.cn/jiaoben/dosbat/130920.html

                常见问题

                相关文章

                发表评论
                暂无评论
                官方客服团队

                为您解决烦忧 - 24小时在线 专业服务